<!DOCTYPE html>
<!-- saved from url=(0077)https://kaiwu.lagou.com/course/courseInfo.htm?courseId=393#/detail/pc?id=4257 -->
<html lang="zh-cmn-Hans" style="font-size: 37.5px;"><script async="" src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/sensorsdata.min.js" charset="UTF-8"></script><script async="" src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/gdtevent.min.js"></script><script type="text/javascript" async="" src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/zhad-tracker@1.4.1"></script><script type="text/javascript" async="" src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/cloudmusic-ad_web-track-js-sdk.js"></script><script id="allow-copy_script">(function agent() {
    let unlock = false
    document.addEventListener('allow_copy', (event) => {
      unlock = event.detail.unlock
    })

    const copyEvents = [
      'copy',
      'cut',
      'contextmenu',
      'selectstart',
      'mousedown',
      'mouseup',
      'mousemove',
      'keydown',
      'keypress',
      'keyup',
    ]
    const rejectOtherHandlers = (e) => {
      if (unlock) {
        e.stopPropagation()
        if (e.stopImmediatePropagation) e.stopImmediatePropagation()
      }
    }
    copyEvents.forEach((evt) => {
      document.documentElement.addEventListener(evt, rejectOtherHandlers, {
        capture: true,
      })
    })
  })()</script><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style class="vjs-styles-defaults">
      .video-js {
        width: 300px;
        height: 150px;
      }

      .vjs-fluid {
        padding-top: 56.25%
      }
    </style>
    
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no, viewport-fit=cover">
    <meta name="format-detection" content="telephone=yes">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <link rel="apple-touch-icon" href="https://s0.lgstatic.com/mds-icon-fed/kaiwu/logo@2x.png">
    <link rel="Shortcut Icon" href="https://s0.lgstatic.com/mds-icon-fed/kaiwu/logo@2x.png" type="image/x-icon">
    <!--[if IE]>
        <script src="//cdn.jsdelivr.net/npm/es6-promise@4.1.1/dist/es6-promise.min.js"></script>
        <script>ES6Promise.polyfill()</script>
    <![endif]-->
        <script> (function(r, d, s) { var queryString = Math.random(); var adlink = d.createElement(s); adlink.type = 'text/javascript'; adlink.async = true; adlink.src = '//iadmusicmat.music.126.net/cloudmusic-ad/web-track-js-sdk.js?' + queryString; var s = d.getElementsByTagName(s)[0]; s.parentNode.insertBefore(adlink, s); })(window, document, 'script'); </script>

<script src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/track-collect.js"></script><script type="text/javascript">
	(function(root) {
	  window.zhad = [];
	  var tag = document.createElement('script'); tag.type ='text/javascript'; tag.async = true;
	  tag.src = '//unpkg.zhimg.com/@efe/zhad-tracker@1.4.1';
	  tag.onerror = function () {
		var img = new Image();
		img.src = '//sugar.zhihu.com/log_fe?js_url=' + window.encodeURIComponent(tag.src) + '&t=' + (+ new Date());
	  }
	  var s = document.getElementsByTagName('script')[0];
	  s.parentNode.insertBefore(tag, s);
	  })(window);
  </script>


<!--微信盆友圈投放插入 JS-->
<script>
    !function(g,d,t,e,v,n,s){if(g.gdt)return;v=g.gdt=function(){v.tk?v.tk.apply(v,arguments):v.queue.push(arguments)};v.sv='1.0';v.bt=0;v.queue=[];n=d.createElement(t);n.async=!0;n.src=e;s=d.getElementsByTagName(t)[0];s.parentNode.insertBefore(n,s);}(window,document,'script','//qzonestyle.gtimg.cn/qzone/biz/gdt/dmp/user-action/gdtevent.min.js');
    gdt('init','1110598596');
    gdt('track','PAGE_VIEW');
</script>
<noscript>
    <img height="1" width="1" style="display:none" src="https://a.gdt.qq.com/pixel?user_action_set_id=1110598596&action_type=PAGE_VIEW&noscript=1"/>
</noscript>

        <script src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/jquery-1.11.1.min.js" class="lazyload" charset="utf-8"></script><style type="text/css">.lg-pay,
.lg-pay-recharge {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: rgba(0, 0, 0, 0.5);
  display: none;
  animation: 0.3s ease both fadeIn;
  z-index: 999;
}
@-webkit-keyframes fadeIn {
  0% {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}
@keyframes fadeIn {
  0% {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}
.lg-pay-container {
  width: 600px;
  position: fixed;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  padding: 50px 50px 70px 50px;
  background: #fff;
  border-radius: 3px;
  box-sizing: border-box;
}
.lg-pay-close {
  position: absolute;
  top: 18px;
  right: 20px;
  width: 14px;
  height: 14px;
  cursor: pointer;
}
.lg-pay-close:after,
.lg-pay-close:before {
  content: "";
  position: absolute;
  top: 50%;
  left: 50%;
  margin-top: -9px;
  margin-left: -0.5px;
  width: 1px;
  height: 18px;
  background: #ccc;
  overflow: hidden;
  transform-origin: center center;
}
.lg-pay-close:before {
  transform: rotate(45deg);
}
.lg-pay-close:after {
  transform: rotate(135deg);
}
.lg-pay-content {
  width: 100%;
  margin-bottom: 40px;
  padding-bottom: 4px;
  overflow: hidden;
}
.lg-pay-content:last-of-type {
  margin: 0;
}
.lg-pay-select {
  position: relative;
  width: 195px;
  border: 1px solid #D3D7D8;
  border-radius: 4px;
  float: left;
  text-align: center;
  line-height: 82px;
  margin-right: 12px;
  box-sizing: border-box;
  cursor: pointer;
}
.lg-pay-select:last-of-type {
  margin: 0;
}
.lg-pay-select:before {
  content: "";
  display: inline-block;
  vertical-align: middle;
  width: 25px;
  height: 25px;
  transition: all ease 0.3s;
  position: absolute;
  top: -1px;
  right: -1px;
}
.lg-pay-select.active {
  border-color: #00B08C;
}
.lg-pay-select.active:before {
  background: url("");
  background-size: 100%;
}
.lg-pay-select i.icon {
  display: inline-block;
  vertical-align: middle;
  width: 40px;
  height: 40px;
  box-sizing: border-box;
}
.lg-pay-select span {
  display: inline-block;
  vertical-align: middle;
  font-size: 14px;
  color: #888;
}
.lg-pay-select.lg-pay-select-wx i.icon {
  background: url("");
  background-size: 100% 100%;
}
.lg-pay-select.lg-pay-select-ali i.icon {
  background: url("");
  background-size: 100% 100%;
}
@media only screen and (-webkit-min-device-pixel-ratio: 2), not all, not all, not all, only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) {
  .lg-pay-select.lg-pay-select-wx i.icon {
    background: url("");
    background-size: 100% 100%;
  }
  .lg-pay-select.lg-pay-select-ali i.icon {
    background: url("");
    background-size: 100% 100%;
  }
}
.lg-pay-qrcode {
  float: left;
  width: 200px;
  height: 200px;
  display: none;
  border-radius: 10px;
  box-sizing: border-box;
  margin-left: 78px;
}
.price .real-price {
  font-family: DINAlternate-Bold;
  font-size: 38px;
  color: #FF7452;
}
.price .real-price::before {
  content: "￥";
  font-family: PingFangSC-Semibold;
  font-size: 28px;
  color: #FF7452;
  vertical-align: text-bottom;
}
.price .original-price {
  font-family: DINAlternate-Bold;
  font-size: 20px;
  color: #999999;
  margin-left: 2px;
  text-decoration: line-through;
}
.price .original-price::before {
  content: "￥";
  font-family: PingFangSC-Semibold;
  font-size: 16px;
  color: #999999;
}
.price .coupon-info {
  background: #FF7452;
  color: white;
  display: inline-block;
  height: 24px;
  line-height: 24px;
  border-radius: 12px 12px 12px 0;
  padding: 0 12px;
  font-size: 14px;
  position: relative;
  bottom: 3px;
}
.lg-pay-recharge * {
  box-sizing: border-box;
}
.lg-pay-recharge .lg-pay-container {
  width: 500px;
  padding: 50px 30px;
}
.lg-pay-recharge .recharge-title {
  font-size: 20px;
  color: #333;
}
.lg-pay-recharge .recharge-label {
  font-size: 14px;
  color: #333333;
  margin: 30px 0 4px 0;
}
.lg-pay-recharge .input {
  width: 440px;
  height: 40px;
  line-height: 40px;
  border: 1px solid #D5DADF;
  border-radius: 3px;
  padding: 0 15px;
}
.lg-pay-recharge .input:focus {
  outline: none;
  border-color: #00b38a;
}
.lg-pay-recharge .recharge-tips {
  color: #333333;
  border-top: 1px dashed #E5E5E5;
  font-size: 14px;
  padding-top: 14px;
  margin-top: 19px;
}
.lg-pay-recharge .recharge-tips .count-show {
  font-size: 18px;
  color: #FF7452;
}
.lg-pay-recharge .recharge-tips .recharge-description {
  font-size: 14px;
  color: #777;
}
.lg-pay-recharge .recharge-btn {
  margin-top: 30px;
  display: inline-block;
  background: #00b38a;
  color: #fff;
  font-size: 16px;
  line-height: 40px;
  height: 40px;
  padding: 0 33px;
  cursor: pointer;
  border-radius: 3px;
}
.lg-pay-recharge .recharge-btn.disabled {
  background: #cccccc;
}
.lg-recharge-pay-container {
  font-family: PingFangHK-Regular;
}
.lg-recharge-pay-container .lg-pay-container {
  width: 500px;
  padding: 50px 30px 17px 30px;
}
.lg-recharge-pay-container * {
  box-sizing: border-box;
}
.lg-recharge-pay-container .lg-pay-close {
  z-index: 2;
}
.lg-recharge-pay-container .recharge-pay-title {
  font-size: 16px;
  color: #666666;
  margin: 28px 0 7px 0;
}
.lg-recharge-pay-container .lg-pay-select {
  line-height: 36px;
}
.lg-recharge-pay-container .lg-pay-select.active:before {
  display: none;
}
.lg-recharge-pay-container .modal-payment-title {
  font-size: 15px;
  color: #6F8192;
  position: absolute;
  top: 0;
  left: 0;
  background: #eee;
  width: 100%;
  line-height: 50px;
  height: 50px;
  padding: 0 30px;
  box-sizing: border-box;
  border-radius: 3px 3px 0 0;
  background: #F9FAFB;
}
.lg-recharge-pay-container .modal-payment-title .title-text {
  vertical-align: middle;
}
.lg-recharge-pay-container .modal-payment-title .icon-hd {
  width: 16px;
  height: 18px;
  display: inline-block;
  vertical-align: middle;
  margin-right: 4px;
  background: url("") no-repeat;
  background-size: contain;
}
.lg-recharge-pay-container .pay-methods-title {
  font-size: 16px;
  color: #666;
  letter-spacing: 0;
}
.lg-recharge-pay-container .pay-method-list {
  margin-top: 6px;
}
.lg-recharge-pay-container .pay-method-list:after {
  content: '';
  display: table;
  clear: both;
}
.lg-recharge-pay-container .lg-pay-qrcode {
  float: inherit;
  width: 136px;
  height: 139px;
  margin: 30px auto 32px auto;
}
.lg-recharge-pay-container .pay-qrcode-label {
  text-align: center;
  font-size: 16px;
  color: #666666;
}
.lg-recharge-pay-container .pay-qrcode-label .pay-qrcode-label-money {
  color: #FF7452;
  font-weight: bold;
}
.lg-recharge-pay-container .pay-method-item {
  position: relative;
  float: left;
  width: 216px;
  height: 40px;
  margin-right: 8px;
  padding: 0;
  text-align: center;
  box-sizing: border-box;
  background: #fff;
  border-radius: 3px;
  cursor: pointer;
}
.lg-recharge-pay-container .pay-method-item:last-child {
  margin: 0;
}
.lg-recharge-pay-container .pay-method-item.active:after {
  content: '';
  position: absolute;
  top: 0px;
  right: -1px;
  width: 33px;
  height: 33px;
  background-repeat: no-repeat;
  background-size: contain;
}
.lg-recharge-pay-container .pay-method-item.active .pay-select-text {
  display: inline;
}
.lg-recharge-pay-container .pay-method-item.pay-wx:hover,
.lg-recharge-pay-container .pay-method-item.pay-wx.active {
  color: #07BB09;
  border-color: #07BB09;
}
.lg-recharge-pay-container .pay-method-item.pay-wx:hover .pay-method-name,
.lg-recharge-pay-container .pay-method-item.pay-wx.active .pay-method-name {
  color: #07BB09;
}
.lg-recharge-pay-container .pay-method-item.pay-wx.active:after {
  background-image: url("");
}
.lg-recharge-pay-container .pay-method-item.pay-ali:hover,
.lg-recharge-pay-container .pay-method-item.pay-ali.active {
  color: #3C95E9;
  border-color: #3C95E9;
}
.lg-recharge-pay-container .pay-method-item.pay-ali:hover .pay-method-name,
.lg-recharge-pay-container .pay-method-item.pay-ali.active .pay-method-name {
  color: #3C95E9;
}
.lg-recharge-pay-container .pay-method-item.pay-ali.active:after {
  background-image: url("");
}
.lg-recharge-pay-container .pay-method-item > i {
  display: inline-block;
  width: 26px;
  height: 26px;
  vertical-align: middle;
  margin-right: 2px;
  background-repeat: no-repeat;
  background-size: contain;
}
.lg-recharge-pay-container .pay-method-item .pay-icon-wx {
  background-image: url("");
}
.lg-recharge-pay-container .pay-method-item .pay-icon-ali {
  background-image: url("");
}
.lg-recharge-pay-container .pay-method-item .pay-method-name,
.lg-recharge-pay-container .pay-method-item .pay-select-text {
  vertical-align: middle;
  line-height: 35px;
  height: 36px;
}
.lg-recharge-pay-container .pay-method-item .pay-select-text {
  display: none;
}
.lg-recharge-pay-container .pay-notes {
  text-align: center;
  margin-top: 27px;
  color: #aaa;
  font-size: 12px;
}
.lg-recharge-pay-container .pay-notes a {
  color: inherit;
  text-decoration: underline;
}
.lg-recharge-pay-container .price-container {
  position: relative;
}
.lg-recharge-pay-container .price-container .coupon-info {
  display: inline-block;
  position: absolute;
  width: max-content;
  top: -24px;
  right: 4px;
  background: #FF7452;
  border-radius: 2px;
  font-size: 12px;
  color: #FFFFFF;
  padding: 1px 8px;
}
.lg-recharge-pay-container .price-container .coupon-info:after {
  content: ' ';
  width: 0;
  height: 0;
  border-width: 4px 4px 0;
  border-style: solid dashed;
  border-color: #FF7452 transparent transparent transparent;
  display: inline-block;
  bottom: -4px;
  position: absolute;
  right: 12px;
}
.lg-recharge-pay-container .price-container .real-price {
  color: #FF7452;
  font-weight: bold;
}
.lg-recharge-pay-container .original-price {
  font-size: 12px;
  color: #666666;
  text-decoration: line-through;
}
.lg-recharge-pay-container .pay-qrcode-status {
  font-size: 16px;
  color: #666;
  white-space: nowrap;
  text-align: center;
  margin-top: 6px;
}
.lg-recharge-pay-container .pay-qrcode-status .left-text {
  display: none;
}
.lg-recharge-pay-container .pay-qrcode-status .link {
  color: #00b38a;
  cursor: pointer;
}
</style><script id="initSaTrack"> ;(function(para) {
                var p = para.sdk_url, n = para.name, w = window, d = document, s = 'script',x = null,y = null;
                w['sensorsDataAnalytic201505'] = n;
                w[n] = w[n] || function(a) {return function() {(w[n]._q = w[n]._q || []).push([a, arguments]);}};
                var ifs = ['track','quick','register','registerPage','registerOnce','clearAllRegister','trackSignup', 'trackAbtest', 'setProfile','setOnceProfile','appendProfile', 'incrementProfile', 'deleteProfile', 'unsetProfile', 'identify','login','logout','trackLink','clearAllRegister','getAppStatus'];
                for (var i = 0; i < ifs.length; i++) {
                    w[n][ifs[i]] = w[n].call(null, ifs[i]);
                }
                if (!w[n]._t) {
                    x = d.createElement(s), y = d.getElementsByTagName(s)[0];
                    x.async = 1;
                    x.src = p;
                    x.charset = 'UTF-8';
                    y.parentNode.insertBefore(x, y);
                    w[n].para = para;
                }
            })({
                sdk_url: 'https://www.lgstatic.com/yun-web-fed/static/common/static/sensorsSDK/1.15.4/js/sensorsdata.min.js',
                name: 'sa',
                cross_subdomain: true,
                server_url: 'https://shenceyun.lagou.com/sa?project=edudata',
                heatmap: {
                    //default 表示开启，自动采集 $WebClick 事件，可以设置 'not_collect' 表示关闭。
                    clickmap:'default',
                    //default 表示开启，自动采集 $WebStay 事件，可以设置 'not_collect' 表示关闭。
                    scroll_notice_map:'default'
                }
            });
            sa.registerPage({"platform_type":"PC","app_type":"lagou_edu","login_status":1});
            //调用代码之后，SDK 就会自动收集页面浏览事件，以及设置初始来源。
            sa.quick('autoTrack');
            </script><link rel="stylesheet" type="text/css" href="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/238.44560b51.css" crossorigin="anonymous"><script charset="utf-8" src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/238.804124a.js" crossorigin="anonymous"></script><script charset="utf-8" src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/2.834a973.js" crossorigin="anonymous"></script><script charset="utf-8" src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/3.58547df.js" crossorigin="anonymous"></script><link rel="stylesheet" type="text/css" href="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/15.37f16514.css" crossorigin="anonymous"><script charset="utf-8" src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/15.f666f22.js" crossorigin="anonymous"></script><link rel="stylesheet" type="text/css" href="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/144.5f8a02c0.css" crossorigin="anonymous"><script charset="utf-8" src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/144.8562d3d.js" crossorigin="anonymous"></script><script charset="utf-8" src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/50.540e0cf.js" crossorigin="anonymous"></script><link rel="stylesheet" type="text/css" href="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/46.616c1574.css" crossorigin="anonymous"><script charset="utf-8" src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/46.06a2590.js" crossorigin="anonymous"></script><script charset="utf-8" src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/49.ebf997e.js" crossorigin="anonymous"></script><style>.one-pan-tip { cursor: pointer;}.one-pan-tip::before {background-position: center;background-size: 100% 100%;background-repeat: no-repeat;box-sizing: border-box;width: 1em;height: 1em;margin: 0 1px .15em 1px;vertical-align: middle;display: inline-block;}.one-pan-tip-success::before {content: '';background-image: url()}.one-pan-tip-error {text-decoration: line-through;}.one-pan-tip-error::before {content: '';background-image: url()}.one-pan-tip-other::before {content: '';background-image: url()}.one-pan-tip-lock::before{content: '';background-image: url()}</style><meta name="ljjc::status" content="on"><style type="text/css">.vue-slider-dot{position:absolute;-webkit-transition:all 0s;transition:all 0s;z-index:5}.vue-slider-dot:focus{outline:none}.vue-slider-dot-tooltip{position:absolute;visibility:hidden}.vue-slider-dot-hover:hover .vue-slider-dot-tooltip,.vue-slider-dot-tooltip-show{visibility:visible}.vue-slider-dot-tooltip-top{top:-10px;left:50%;-webkit-transform:translate(-50%,-100%);transform:translate(-50%,-100%)}.vue-slider-dot-tooltip-bottom{bottom:-10px;left:50%;-webkit-transform:translate(-50%,100%);transform:translate(-50%,100%)}.vue-slider-dot-tooltip-left{left:-10px;top:50%;-webkit-transform:translate(-100%,-50%);transform:translate(-100%,-50%)}.vue-slider-dot-tooltip-right{right:-10px;top:50%;-webkit-transform:translate(100%,-50%);transform:translate(100%,-50%)}</style><style type="text/css">.vue-slider-marks{position:relative;width:100%;height:100%}.vue-slider-mark{position:absolute;z-index:1}.vue-slider-ltr .vue-slider-mark,.vue-slider-rtl .vue-slider-mark{width:0;height:100%;top:50%}.vue-slider-ltr .vue-slider-mark-step,.vue-slider-rtl .vue-slider-mark-step{top:0}.vue-slider-ltr .vue-slider-mark-label,.vue-slider-rtl .vue-slider-mark-label{top:100%;margin-top:10px}.vue-slider-ltr .vue-slider-mark{-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.vue-slider-ltr .vue-slider-mark-step{left:0}.vue-slider-ltr .vue-slider-mark-label{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.vue-slider-rtl .vue-slider-mark{-webkit-transform:translate(50%,-50%);transform:translate(50%,-50%)}.vue-slider-rtl .vue-slider-mark-step{right:0}.vue-slider-rtl .vue-slider-mark-label{right:50%;-webkit-transform:translateX(50%);transform:translateX(50%)}.vue-slider-btt .vue-slider-mark,.vue-slider-ttb .vue-slider-mark{width:100%;height:0;left:50%}.vue-slider-btt .vue-slider-mark-step,.vue-slider-ttb .vue-slider-mark-step{left:0}.vue-slider-btt .vue-slider-mark-label,.vue-slider-ttb .vue-slider-mark-label{left:100%;margin-left:10px}.vue-slider-btt .vue-slider-mark{-webkit-transform:translate(-50%,50%);transform:translate(-50%,50%)}.vue-slider-btt .vue-slider-mark-step{top:0}.vue-slider-btt .vue-slider-mark-label{top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.vue-slider-ttb .vue-slider-mark{-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.vue-slider-ttb .vue-slider-mark-step{bottom:0}.vue-slider-ttb .vue-slider-mark-label{bottom:50%;-webkit-transform:translateY(50%);transform:translateY(50%)}.vue-slider-mark-label,.vue-slider-mark-step{position:absolute}</style><style type="text/css">.vue-slider{position:relative;-webkit-box-sizing:content-box;box-sizing:content-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:block;-webkit-tap-highlight-color:rgba(0,0,0,0)}.vue-slider-rail{position:relative;width:100%;height:100%;-webkit-transition-property:width,height,left,right,top,bottom;transition-property:width,height,left,right,top,bottom}.vue-slider-process{position:absolute;z-index:1}</style><script src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/hls.min.0.13.2m.js" type="text/javascript"></script><script src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/tcplayer.v4.1.min.js" type="text/javascript"></script><link href="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/tcplayer.css" rel="stylesheet" type="text/css"><script src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/jquery.validate.js" class="lazyload" charset="utf-8"></script><script src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/lagou.js" class="lazyload" charset="utf-8"></script><script src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/colorbox.min.js" class="lazyload" charset="utf-8"></script><script src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/stringifyJSON.min.js" class="lazyload" charset="utf-8"></script><script src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/md5.js" class="lazyload" charset="utf-8"></script></head><body style="font-size: 24px; height: 100%; width: 100%; background-color: rgb(237, 237, 237);"><h1 style="display: none">Dubbo源码解读与实战 - 拉勾教育</h1>
    
        <meta content="Dubbo,后端开发,RPC 框架,Java,Spring Cloud,Dubbo SPI,分布式,微服务,远程服务调用,集群,架构,架构师,Netty,ZooKeeper,Curator,ZkClient,序列化算法,动态代理,事件驱动,注册中心,本地缓存,重试机制,元数据,RPC,remoting,Protocol,Proxy,Filter,Clustr,集群容错,负载均衡,路由机制,Monitor,Mock,Plugin" name="keywords">
    
        <meta content="近年来各大互联网公司都因业务复杂化，在落地微服务架构。Dubbo 作为一款高性能、轻量级的 RPC 框架，正好能解决微服务架构落地中遇到的各种问题。本专栏以结合实战的方式深度解读 Dubbo 源码，理解核心功能实现，再带你使用这些核心技术，通过编写一个简易版本的 RPC 框架串联所有知识点，更好地应对实战。" name="description">
    
        <title>Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育</title>
    <meta name="apple-mobile-web-app-title" content="Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育">
    
        <script>
    // 全局token变量，防CSRF，防重复提交
    window.X_Anti_Forge_Code = '';
    window.X_Anti_Forge_Token = '';
    var mds = {
        userInfo: {
            shortName: "",
        }
    }
    window.mds = mds;
</script>

    <script>
        window.userInfo = {
            userId: '16904644',
        };
    </script>
    <link href="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/common.b6133e53.css" rel="stylesheet"><link href="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/main.25c8eeea.css" rel="stylesheet">

    
        <div id="app" class=""><div data-v-7ae8acec="" data-v-44232f8a="" class="pc-detail-wrap"><div data-v-306e4c0a="" data-v-7ae8acec="" class="wrap pc-header"><div data-v-306e4c0a="" class="wrap-content"><div data-v-306e4c0a="" class="wrap-left"><img data-v-306e4c0a="" src="" alt="" class="logo"> <span data-v-306e4c0a="" class="title">拉勾教育</span> <span data-v-306e4c0a="" class="desc">互联网人实战大学</span></div> <div data-v-306e4c0a="" class="wrap-right"><div data-v-306e4c0a="" class="tab-list"><span data-v-306e4c0a="" class="tab-item">
                    选课
                </span><span data-v-306e4c0a="" class="tab-item">
                    学习
                </span><span data-v-306e4c0a="" class="tab-item">
                    企业培训
                </span></div> <div data-v-306e4c0a="" class="login-wrap"><div data-v-306e4c0a="" class="wrap-login"><span data-v-306e4c0a="" class="username triangle">
                        用户0778
                        <div data-v-306e4c0a="" class="tool-tip tool-tip-user"><a data-v-306e4c0a="" href="https://webchat.7moor.com/wapchat.html?accessId=d2399a80-0b6e-11ea-a5c0-bfdef258dfcd&amp;fromUrl=http://jiaoyu.lagou.com&amp;urlTitle=jiaoyuPC" target="_blank" class="tool-tip-item" one-link-mark="yes">
                                帮助与反馈
                            </a><a data-v-306e4c0a="" href="https://edu.lagou.com/setting" target="_self" class="tool-tip-item" one-link-mark="yes">
                                账号设置
                            </a><a data-v-306e4c0a="" href="https://kaiwu.lagou.com/frontLogout.do" target="_self" class="tool-tip-item" one-link-mark="yes">
                                退出登录
                            </a></div></span> <img data-v-306e4c0a="" src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/default_headpic.png" alt="" class="avatar"></div></div></div></div> <div data-v-a56b928a="" data-v-306e4c0a=""><div data-v-f8659a78="" data-v-a56b928a="" class="modal" style="display: none;"><div data-v-f8659a78="" class="modal-content"><button data-v-f8659a78="" class="close"></button> <div data-v-f8659a78="" class="title-content"><div data-v-f8659a78="" class="title">
                拉勾教育
            </div> <div data-v-f8659a78="" class="desc">
                互联网实战大学
            </div></div> <div data-v-f8659a78="" class="account-container"><ul data-v-f8659a78="" class="account-title-c"><li data-v-f8659a78="" class="account-s account-active"><span data-v-f8659a78="" class="account-text">手机号登录</span></li> <li data-v-f8659a78="" class="account-s"><span data-v-f8659a78="" class="account-text">账户密码登录</span></li></ul> <!----> <div data-v-f8659a78="" class="form-area"><div data-v-f8659a78="" class="forms-top-wrapper"><div data-v-f8659a78="" class="forms-top-code"><form data-v-f8659a78="" action="https://kaiwu.lagou.com/course/courseInfo.htm?courseId=393"><div data-v-f8659a78="" class="input-item"><span data-v-f8659a78="" class="area-code">0086</span> <div data-v-3959ee0f="" data-v-f8659a78="" class="code-list-wrap login-phone" style="display: none;"><div data-v-3959ee0f=""><div data-v-3959ee0f="" class="tips">
            常用
        </div> <div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">中国</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">0086</span></div><div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">中国香港</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">00852</span></div><div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">中国台湾</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">00886</span></div><div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">中国澳门</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">00853</span></div><div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">美国</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">001</span></div></div><div data-v-3959ee0f=""><div data-v-3959ee0f="" class="tips">
            A
        </div> <div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">澳大利亚</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">0061</span></div><div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">中国澳门</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">00853</span></div><div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">爱尔兰</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">00353</span></div></div><div data-v-3959ee0f=""><div data-v-3959ee0f="" class="tips">
            B
        </div> <div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">巴西</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">0055</span></div></div><div data-v-3959ee0f=""><div data-v-3959ee0f="" class="tips">
            D
        </div> <div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">德国</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">0049</span></div></div><div data-v-3959ee0f=""><div data-v-3959ee0f="" class="tips">
            E
        </div> <div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">俄罗斯</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">007</span></div></div><div data-v-3959ee0f=""><div data-v-3959ee0f="" class="tips">
            F
        </div> <div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">法国</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">0033</span></div></div><div data-v-3959ee0f=""><div data-v-3959ee0f="" class="tips">
            H
        </div> <div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">韩国</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">0082</span></div><div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">荷兰</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">0031</span></div></div><div data-v-3959ee0f=""><div data-v-3959ee0f="" class="tips">
            J
        </div> <div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">加拿大</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">001</span></div></div><div data-v-3959ee0f=""><div data-v-3959ee0f="" class="tips">
            M
        </div> <div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">马来西亚</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">0060</span></div><div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">美国</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">001</span></div></div><div data-v-3959ee0f=""><div data-v-3959ee0f="" class="tips">
            R
        </div> <div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">日本</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">0081</span></div></div><div data-v-3959ee0f=""><div data-v-3959ee0f="" class="tips">
            T
        </div> <div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">中国台湾</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">00886</span></div><div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">泰国</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">0066</span></div></div><div data-v-3959ee0f=""><div data-v-3959ee0f="" class="tips">
            X
        </div> <div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">中国香港</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">00852</span></div><div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">新加坡</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">0065</span></div><div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">新西兰</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">0064</span></div></div><div data-v-3959ee0f=""><div data-v-3959ee0f="" class="tips">
            Y
        </div> <div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">印度</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">0091</span></div><div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">英国</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">0044</span></div><div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">越南</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">0084</span></div><div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">印度尼西亚</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">0062</span></div></div><div data-v-3959ee0f=""><div data-v-3959ee0f="" class="tips">
            Z
        </div> <div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">中国</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">0086</span></div></div> <div data-v-f8659a78="" data-v-3959ee0f="" class="end-tips">
                                            如果没有找到您的所在归属地，请拨打客服电话4006282835解决。
                                        </div></div> <input data-v-f8659a78="" name="" type="tel" placeholder="请输入常用手机号" data-required="required" autocomplete="off" class="input login-enter-phone"> <div data-v-f8659a78="" class="input-tips" style="display: none;">
                                    
                                </div> <div data-v-f8659a78="" class="clear" style="display: none;"></div></div> <div data-v-f8659a78="" class="input-item"><input data-v-f8659a78="" type="text" name="" placeholder="请输入验证码" maxlength="6" data-required="required" autocomplete="off" class="input login-enter-code"> <button data-v-f8659a78="" class="require-code">
                                    获取验证码
                                </button> <div data-v-f8659a78="" class="input-tips" style="display: none;">
                                    
                                </div></div></form> <form data-v-f8659a78="" action="https://kaiwu.lagou.com/course/courseInfo.htm?courseId=393" style="display: none;"><div data-v-f8659a78="" class="input-item"><input data-v-f8659a78="" placeholder="请输入常用手机号/邮箱" data-required="required" autocomplete="off" class="input"> <div data-v-f8659a78="" class="input-tips" style="display: none;">
                                    
                                </div> <div data-v-f8659a78="" class="clear" style="display: none;"></div></div> <div data-v-f8659a78="" class="input-item"><input data-v-f8659a78="" type="password" placeholder="请输入密码" data-required="required" autocomplete="off" class="input"> <div data-v-f8659a78="" class="input-tips" style="display: none;">
                                    
                                </div> <div data-v-f8659a78="" class="clear" style="display: none;"></div></div></form></div> <button data-v-f8659a78="" class="login-btn">
                        登录
                    </button> <!----> <a data-v-f8659a78="" class="we-chat-c" one-link-mark="yes"><img data-v-f8659a78="" src="" alt="" class="we-chat-i"> <span data-v-f8659a78="" class="we-chat-s">微信扫码登录</span></a></div></div></div></div></div></div></div> <div data-v-7ae8acec="" class="container"><div data-v-43fadf79="" data-v-7ae8acec="" class="pub-header"><div data-v-43fadf79="" class="pub-header-container-wrap"><div data-v-43fadf79="" class="item-wrap inline-block catalog"><div data-v-43fadf79="" class="img-wrap inline-block"></div> <div data-v-43fadf79="" class="text-wrap inline-block">
                收起目录
            </div></div> <div data-v-43fadf79="" class="splice-line inline-block"></div> <div data-v-43fadf79="" class="item-wrap inline-block pre"><div data-v-43fadf79="" class="img-wrap inline-block"></div> <div data-v-43fadf79="" class="text-wrap inline-block">
                上一讲
            </div></div> <div data-v-43fadf79="" class="splice-line inline-block"></div> <div data-v-43fadf79="" class="item-wrap inline-block next"><div data-v-43fadf79="" class="img-wrap inline-block"></div> <div data-v-43fadf79="" class="text-wrap inline-block">
                下一讲
            </div></div> <div data-v-43fadf79="" class="splice-line inline-block"></div> <div data-v-43fadf79="" class="item-wrap inline-block detail"><div data-v-43fadf79="" class="img-wrap inline-block"></div> <div data-v-43fadf79="" class="text-wrap inline-block">
                课程详情
            </div></div> <div data-v-43fadf79="" class="splice-line inline-block"></div> <div data-v-43fadf79="" class="item-wrap inline-block all"><div data-v-43fadf79="" class="img-wrap inline-block"></div> <div data-v-43fadf79="" class="text-wrap inline-block">
                全部课程
            </div></div></div></div> <div data-v-7ae8acec="" class="content-wrap"><div data-v-7ae8acec="" class="left-content-wrap"><div data-v-6b0ce13c="" data-v-7ae8acec="" class="menu-top-tips inline-block"><img data-v-6b0ce13c="" src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/Ciqc1F8_k2qAfGFoAABLQgwJtbM707.png" class="image-wrap"> <div data-v-6b0ce13c="" class="menu-top-tips-wrap inline-block"><div data-v-6b0ce13c="" class="title">
            Dubbo源码解读与实战
        </div> <div data-v-6b0ce13c="" class="name">
            杨四正
            <div data-v-6b0ce13c="" class="incise inline-block"></div>
            资深技术专家，源码剖析畅销书作者
        </div> <div data-v-6b0ce13c="" class="person">
            16487人已购买
        </div> <div data-v-6b0ce13c="" class="button">
            查看详情
        </div></div></div> <div data-v-7ae8acec="" class="menu-section-fixed single-line" style="top: 258px;">
                    第一部分：基础知识
                </div> <div data-v-7ae8acec="" class="menu-content calc"><div data-v-3da7ec42="" data-v-7ae8acec="" class="class-menu-contaniner more-sections more-sections-detail"><!----> <div data-v-3da7ec42=""><div data-v-3da7ec42="" class="section-name single-line section-name-detail">
            开篇词
        </div> <div data-v-3da7ec42="" class="class-menu-block"><div data-v-3da7ec42="" class="class-level-one over-ellipsis    class-level-one-detail"><div data-v-3da7ec42="" class="text-wrap"><div data-v-3da7ec42="" class="content">
                        开篇词 | 深入掌握 Dubbo 原理与实现，提升你的职场竞争力
                    </div> <div data-v-3da7ec42="" class="item-status-wrap"><!----></div></div></div></div></div><div data-v-3da7ec42=""><div data-v-3da7ec42="" class="section-name single-line section-name-detail">
            第一部分：基础知识
        </div> <div data-v-3da7ec42="" class="class-menu-block"><div data-v-3da7ec42="" class="class-level-one over-ellipsis   isclick  class-level-one-detail"><div data-v-3da7ec42="" class="text-wrap"><div data-v-3da7ec42="" class="content">
                        01 | Dubbo 源码环境搭建：千里之行，始于足下
                    </div> <div data-v-3da7ec42="" class="item-status-wrap"><!----></div></div></div><div data-v-3da7ec42="" class="class-level-one over-ellipsis    class-level-one-detail"><div data-v-3da7ec42="" class="text-wrap"><div data-v-3da7ec42="" class="content">
                        02 | Dubbo 的配置总线：抓住 URL，就理解了半个 Dubbo
                    </div> <div data-v-3da7ec42="" class="item-status-wrap"><!----></div></div></div><div data-v-3da7ec42="" class="class-level-one over-ellipsis    class-level-one-detail"><div data-v-3da7ec42="" class="text-wrap"><div data-v-3da7ec42="" class="content">
                        03 | Dubbo SPI 精析，接口实现两极反转（上）
                    </div> <div data-v-3da7ec42="" class="item-status-wrap"><!----></div></div></div><div data-v-3da7ec42="" class="class-level-one over-ellipsis    class-level-one-detail"><div data-v-3da7ec42="" class="text-wrap"><div data-v-3da7ec42="" class="content">
                        04 | Dubbo SPI 精析，接口实现两极反转（下）
                    </div> <div data-v-3da7ec42="" class="item-status-wrap"><!----></div></div></div><div data-v-3da7ec42="" class="class-level-one over-ellipsis    class-level-one-detail"><div data-v-3da7ec42="" class="text-wrap"><div data-v-3da7ec42="" class="content">
                        05 | 海量定时任务，一个时间轮搞定
                    </div> <div data-v-3da7ec42="" class="item-status-wrap"><!----></div></div></div><div data-v-3da7ec42="" class="class-level-one over-ellipsis    class-level-one-detail"><div data-v-3da7ec42="" class="text-wrap"><div data-v-3da7ec42="" class="content">
                        06 | ZooKeeper 与 Curator，求你别用 ZkClient 了（上）
                    </div> <div data-v-3da7ec42="" class="item-status-wrap"><!----></div></div></div><div data-v-3da7ec42="" class="class-level-one over-ellipsis    class-level-one-detail"><div data-v-3da7ec42="" class="text-wrap"><div data-v-3da7ec42="" class="content">
                        07 | ZooKeeper 与 Curator，求你别用 ZkClient 了（下）
                    </div> <div data-v-3da7ec42="" class="item-status-wrap"><!----></div></div></div><div data-v-3da7ec42="" class="class-level-one over-ellipsis    class-level-one-detail"><div data-v-3da7ec42="" class="text-wrap"><div data-v-3da7ec42="" class="content">
                        08 | 代理模式与常见实现
                    </div> <div data-v-3da7ec42="" class="item-status-wrap"><!----></div></div></div><div data-v-3da7ec42="" class="class-level-one over-ellipsis    class-level-one-detail"><div data-v-3da7ec42="" class="text-wrap"><div data-v-3da7ec42="" class="content">
                        09 | Netty 入门，用它做网络编程都说好（上）
                    </div> <div data-v-3da7ec42="" class="item-status-wrap"><!----></div></div></div><div data-v-3da7ec42="" class="class-level-one over-ellipsis    class-level-one-detail"><div data-v-3da7ec42="" class="text-wrap"><div data-v-3da7ec42="" class="content">
                        10 | Netty 入门，用它做网络编程都说好（下）
                    </div> <div data-v-3da7ec42="" class="item-status-wrap"><!----></div></div></div><div data-v-3da7ec42="" class="class-level-one over-ellipsis    class-level-one-detail"><div data-v-3da7ec42="" class="text-wrap"><div data-v-3da7ec42="" class="content">
                        11 | 简易版 RPC 框架实现（上）
                    </div> <div data-v-3da7ec42="" class="item-status-wrap"><!----></div></div></div><div data-v-3da7ec42="" class="class-level-one over-ellipsis    class-level-one-detail"><div data-v-3da7ec42="" class="text-wrap"><div data-v-3da7ec42="" class="content">
                        12 | 简易版 RPC 框架实现（下）
                    </div> <div data-v-3da7ec42="" class="item-status-wrap"><!----></div></div></div></div></div><div data-v-3da7ec42=""><div data-v-3da7ec42="" class="section-name single-line section-name-detail">
            第二部分：注册中心
        </div> <div data-v-3da7ec42="" class="class-menu-block"><div data-v-3da7ec42="" class="class-level-one over-ellipsis    class-level-one-detail"><div data-v-3da7ec42="" class="text-wrap"><div data-v-3da7ec42="" class="content">
                        13 | 本地缓存：降低 ZooKeeper 压力的一个常用手段
                    </div> <div data-v-3da7ec42="" class="item-status-wrap"><!----></div></div></div><div data-v-3da7ec42="" class="class-level-one over-ellipsis    class-level-one-detail"><div data-v-3da7ec42="" class="text-wrap"><div data-v-3da7ec42="" class="content">
                        14 | 重试机制是网络操作的基本保证
                    </div> <div data-v-3da7ec42="" class="item-status-wrap"><!----></div></div></div><div data-v-3da7ec42="" class="class-level-one over-ellipsis    class-level-one-detail"><div data-v-3da7ec42="" class="text-wrap"><div data-v-3da7ec42="" class="content">
                        15 | ZooKeeper 注册中心实现，官方推荐注册中心实践
                    </div> <div data-v-3da7ec42="" class="item-status-wrap"><!----></div></div></div></div></div><div data-v-3da7ec42=""><div data-v-3da7ec42="" class="section-name single-line section-name-detail">
            第三部分：服务通信
        </div> <div data-v-3da7ec42="" class="class-menu-block"><div data-v-3da7ec42="" class="class-level-one over-ellipsis    class-level-one-detail"><div data-v-3da7ec42="" class="text-wrap"><div data-v-3da7ec42="" class="content">
                        16 | Dubbo Serialize 层：多种序列化算法，总有一款适合你
                    </div> <div data-v-3da7ec42="" class="item-status-wrap"><!----></div></div></div><div data-v-3da7ec42="" class="class-level-one over-ellipsis    class-level-one-detail"><div data-v-3da7ec42="" class="text-wrap"><div data-v-3da7ec42="" class="content">
                        17 | Dubbo Remoting 层核心接口分析：这居然是一套兼容所有 NIO 框架的设计？
                    </div> <div data-v-3da7ec42="" class="item-status-wrap"><!----></div></div></div><div data-v-3da7ec42="" class="class-level-one over-ellipsis    class-level-one-detail"><div data-v-3da7ec42="" class="text-wrap"><div data-v-3da7ec42="" class="content">
                        18 | Buffer 缓冲区：我们不生产数据，我们只是数据的搬运工
                    </div> <div data-v-3da7ec42="" class="item-status-wrap"><!----></div></div></div><div data-v-3da7ec42="" class="class-level-one over-ellipsis  iswait  class-level-one-detail"><div data-v-3da7ec42="" class="text-wrap"><div data-v-3da7ec42="" class="content">
                        19 | Transporter 层核心实现：编解码与线程模型一文打尽
                    </div> <div data-v-3da7ec42="" class="item-status-wrap"><div data-v-3da7ec42="" class="item-status wait">
                            待更新
                        </div></div></div></div><div data-v-3da7ec42="" class="class-level-one over-ellipsis  iswait  class-level-one-detail"><div data-v-3da7ec42="" class="text-wrap"><div data-v-3da7ec42="" class="content">
                        20 | Exchange 层剖析：彻底搞懂 Request-Response 模型
                    </div> <div data-v-3da7ec42="" class="item-status-wrap"><div data-v-3da7ec42="" class="item-status wait">
                            待更新
                        </div></div></div></div></div></div><div data-v-3da7ec42=""><div data-v-3da7ec42="" class="section-name single-line section-name-detail">
            第四部分：RPC 功能核心实现
        </div> <div data-v-3da7ec42="" class="class-menu-block"><div data-v-3da7ec42="" class="class-level-one over-ellipsis  iswait  class-level-one-detail"><div data-v-3da7ec42="" class="text-wrap"><div data-v-3da7ec42="" class="content">
                        21 | 核心接口介绍，RPC 层骨架梳理
                    </div> <div data-v-3da7ec42="" class="item-status-wrap"><div data-v-3da7ec42="" class="item-status wait">
                            待更新
                        </div></div></div></div><div data-v-3da7ec42="" class="class-level-one over-ellipsis  iswait  class-level-one-detail"><div data-v-3da7ec42="" class="text-wrap"><div data-v-3da7ec42="" class="content">
                        22 | 从 Protocol 起手，看服务暴露和服务引用的全流程
                    </div> <div data-v-3da7ec42="" class="item-status-wrap"><div data-v-3da7ec42="" class="item-status wait">
                            待更新
                        </div></div></div></div><div data-v-3da7ec42="" class="class-level-one over-ellipsis  iswait  class-level-one-detail"><div data-v-3da7ec42="" class="text-wrap"><div data-v-3da7ec42="" class="content">
                        23 | 复杂问题简单化，代理帮你隐藏了多少底层细节？
                    </div> <div data-v-3da7ec42="" class="item-status-wrap"><div data-v-3da7ec42="" class="item-status wait">
                            待更新
                        </div></div></div></div><div data-v-3da7ec42="" class="class-level-one over-ellipsis  iswait  class-level-one-detail"><div data-v-3da7ec42="" class="text-wrap"><div data-v-3da7ec42="" class="content">
                        24 | Filter 接口，扩展 Dubbo 框架的常用手段指北
                    </div> <div data-v-3da7ec42="" class="item-status-wrap"><div data-v-3da7ec42="" class="item-status wait">
                            待更新
                        </div></div></div></div></div></div><div data-v-3da7ec42=""><div data-v-3da7ec42="" class="section-name single-line section-name-detail">
            第五部分：集群
        </div> <div data-v-3da7ec42="" class="class-menu-block"><div data-v-3da7ec42="" class="class-level-one over-ellipsis  iswait  class-level-one-detail"><div data-v-3da7ec42="" class="text-wrap"><div data-v-3da7ec42="" class="content">
                        25 | 集群容错：一个好汉三个帮
                    </div> <div data-v-3da7ec42="" class="item-status-wrap"><div data-v-3da7ec42="" class="item-status wait">
                            待更新
                        </div></div></div></div><div data-v-3da7ec42="" class="class-level-one over-ellipsis  iswait  class-level-one-detail"><div data-v-3da7ec42="" class="text-wrap"><div data-v-3da7ec42="" class="content">
                        26 | 路由机制：请求到底怎么走，它说了算
                    </div> <div data-v-3da7ec42="" class="item-status-wrap"><div data-v-3da7ec42="" class="item-status wait">
                            待更新
                        </div></div></div></div><div data-v-3da7ec42="" class="class-level-one over-ellipsis  iswait  class-level-one-detail"><div data-v-3da7ec42="" class="text-wrap"><div data-v-3da7ec42="" class="content">
                        27 | 负载均衡：公平公正物尽其用的负载均衡策略，这里都有
                    </div> <div data-v-3da7ec42="" class="item-status-wrap"><div data-v-3da7ec42="" class="item-status wait">
                            待更新
                        </div></div></div></div></div></div><div data-v-3da7ec42=""><div data-v-3da7ec42="" class="section-name single-line section-name-detail">
            第六部分：服务自省、元数据与配置中心
        </div> <div data-v-3da7ec42="" class="class-menu-block"><div data-v-3da7ec42="" class="class-level-one over-ellipsis  iswait  class-level-one-detail"><div data-v-3da7ec42="" class="text-wrap"><div data-v-3da7ec42="" class="content">
                        28 | 服务自省设计方案：新版本新方案
                    </div> <div data-v-3da7ec42="" class="item-status-wrap"><div data-v-3da7ec42="" class="item-status wait">
                            待更新
                        </div></div></div></div><div data-v-3da7ec42="" class="class-level-one over-ellipsis  iswait  class-level-one-detail"><div data-v-3da7ec42="" class="text-wrap"><div data-v-3da7ec42="" class="content">
                        29 | 元数据方案深度剖析，如何避免注册中心数据量膨胀？
                    </div> <div data-v-3da7ec42="" class="item-status-wrap"><div data-v-3da7ec42="" class="item-status wait">
                            待更新
                        </div></div></div></div><div data-v-3da7ec42="" class="class-level-one over-ellipsis  iswait  class-level-one-detail"><div data-v-3da7ec42="" class="text-wrap"><div data-v-3da7ec42="" class="content">
                        30 | 配置中心设计与实现：集中化配置 and 本地化配置，我都要
                    </div> <div data-v-3da7ec42="" class="item-status-wrap"><div data-v-3da7ec42="" class="item-status wait">
                            待更新
                        </div></div></div></div></div></div></div></div></div> <div data-v-7ae8acec="" class="right-content-wrap" style="height: 499px;"><div data-v-84b38976="" data-v-7ae8acec="" class="main-wrap"><div data-v-84b38976=""><div data-v-84b38976="" class="main-title">
            01 | Dubbo 源码环境搭建：千里之行，始于足下
        </div> <div data-v-84b38976="" class="main-tips">
            2020/07/27
            <span data-v-84b38976="" class="auth">杨四正</span></div> <div data-v-84b38976="" class="media-player-wrap"><div data-v-dd23bc98="" data-v-84b38976=""><div data-v-dd23bc98="" class="media-container"><div data-v-dd23bc98="" class="button-wrap inline-block"><div data-v-dd23bc98="" class="button-icon inline-block"></div></div> <div data-v-dd23bc98="" class="data-wrap inline-block"><div data-v-dd23bc98="" class="progress-bar"><div class="vue-slider vue-slider-ltr" style="padding: 7px 0px; width: auto; height: 4px;"><div class="vue-slider-rail" style="height: 2px; background: rgb(213, 218, 223); border-radius: 1.5px;"><div class="vue-slider-process" style="height: 100%; top: 0px; left: 0%; width: 0%; transition-property: width, left; transition-duration: 0.5s; background: rgb(0, 179, 138);"></div><div aria-valuetext="00:00/18:25" class="vue-slider-dot vue-slider-dot-hover" role="slider" aria-valuenow="0" aria-valuemin="0" aria-valuemax="1105" aria-orientation="horizontal" tabindex="0" style="width: 14px; height: 14px; transform: translate(-50%, -50%); top: 50%; left: 0%; transition: left 0.5s ease 0s;"><div class="vue-slider-dot-handle" style="width: 16px; height: 16px; background: rgb(0, 179, 138); box-shadow: none; margin-top: -1px; z-index: 1;"></div><div class="vue-slider-dot-tooltip vue-slider-dot-tooltip-top"><div class="vue-slider-dot-tooltip-inner vue-slider-dot-tooltip-inner-top" style="padding: 2px 12px; border-radius: 14px; font-size: 14px; color: rgb(255, 255, 255); background: rgb(0, 179, 138); min-width: 20px; border-color: rgb(0, 179, 138);"><span class="vue-slider-dot-tooltip-text">00:00/18:25</span></div></div></div></div></div></div> <div data-v-dd23bc98="" class="detail-wrap "><div data-v-dd23bc98="" class="detail-one">
                    16.93M
                </div> <div data-v-dd23bc98="" class="detail-two">
                    00:00/18:25
                </div></div></div> <div data-v-dd23bc98="" class="division-line inline-block"></div> <div data-v-dd23bc98="" class="viedo-wrap inline-block"><div data-v-dd23bc98="" class="viedo-icon"></div> <div data-v-dd23bc98="" class="text">
                看视频
            </div></div></div> <!----></div></div> <div data-v-84b38976="" class="main-container"><div data-v-84b38976="" class="rich-text-wrap"><p data-nodeid="14674" class=""><strong data-nodeid="14679">好的开始是成功的一半，阅读源码也是一样。</strong> 很多同学在下定决心阅读一个开源框架之后，就一头扎进去，迷失在代码“迷宫”中。此时，有同学意识到，需要一边 Debug 一边看；然后又有一批同学在搭建源码环境的时候兜兜转转，走上了放弃之路；最后剩下为数不多的同学，搭建完了源码环境，却又不知道如何模拟请求让源码执行到自己想要 Debug 的地方。</p>



<p data-nodeid="12029">以上这些痛点问题你是不是很熟悉？是不是也曾遇到过？没关系，本课时我就来手把手带领你搭建 Dubbo 源码环境。</p>
<ul data-nodeid="12030">
<li data-nodeid="12031">
<p data-nodeid="12032">在开始搭建源码环境之前，我们会先整体过一下 Dubbo 的架构，这可以帮助你了解 Dubbo 的基本功能以及核心角色。</p>
</li>
<li data-nodeid="12033">
<p data-nodeid="12034">之后我们再动手搭建 Dubbo 源码环境，构建一个 Demo 示例可运行的最简环境。</p>
</li>
<li data-nodeid="12035">
<p data-nodeid="12036">完成源码环境搭建之后，我们还会深入介绍 Dubbo 源码中各个核心模块的功能，这会为后续分析各个模块的实现做铺垫。</p>
</li>
<li data-nodeid="12037">
<p data-nodeid="12038">最后，我们再详细分析下 Dubbo 源码自带的三个 Demo 示例，简单回顾一下 Dubbo 的基本用法，这三个示例也将是我们后续 Debug 源码的入口。</p>
</li>
</ul>
<h3 data-nodeid="15336" class="">Dubbo 架构简介</h3>

<p data-nodeid="16636">为便于你更好理解和学习，在开始搭建 Dubbo 源码环境之前，我们先来简单介绍一下 Dubbo 架构中的核心角色，帮助你简单回顾一下 Dubbo 的架构，也帮助不熟悉 Dubbo 的小伙伴快速了解 Dubbo。下图展示了 Dubbo 核心架构：</p>
<p data-nodeid="56436"><img src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/CgqCHl8eRaCAW4-LAAB7_C-aKWA601.png" alt="Drawing 0.png" data-nodeid="56440"></p>
<div data-nodeid="57073" class=""><p style="text-align:center">Dubbo 核心架构图</p> </div>







<ul data-nodeid="12044">
<li data-nodeid="12045">
<p data-nodeid="12046"><strong data-nodeid="12183">Registry：注册中心。</strong> 负责服务地址的注册与查找，服务的 Provider 和 Consumer 只在启动时与注册中心交互。注册中心通过长连接感知 Provider 的存在，在 Provider 出现宕机的时候，注册中心会立即推送相关事件通知 Consumer。</p>
</li>
<li data-nodeid="12047">
<p data-nodeid="12048"><strong data-nodeid="12188">Provider：服务提供者。</strong> 在它启动的时候，会向 Registry 进行注册操作，将自己服务的地址和相关配置信息封装成 URL 添加到 ZooKeeper 中。</p>
</li>
<li data-nodeid="12049">
<p data-nodeid="12050"><strong data-nodeid="12193">Consumer：服务消费者。</strong> 在它启动的时候，会向 Registry 进行订阅操作。订阅操作会从 ZooKeeper 中获取 Provider 注册的 URL，并在 ZooKeeper 中添加相应的监听器。获取到 Provider URL 之后，Consumer 会根据负载均衡算法从多个 Provider 中选择一个 Provider 并与其建立连接，最后发起对 Provider 的 RPC 调用。 如果 Provider URL 发生变更，Consumer 将会通过之前订阅过程中在注册中心添加的监听器，获取到最新的 Provider URL 信息，进行相应的调整，比如断开与宕机 Provider 的连接，并与新的 Provider 建立连接。Consumer 与 Provider 建立的是长连接，且 Consumer 会缓存 Provider 信息，所以一旦连接建立，即使注册中心宕机，也不会影响已运行的 Provider 和 Consumer。</p>
</li>
<li data-nodeid="12051">
<p data-nodeid="12052"><strong data-nodeid="12198">Monitor：监控中心。</strong> 用于统计服务的调用次数和调用时间。Provider 和 Consumer 在运行过程中，会在内存中统计调用次数和调用时间，定时每分钟发送一次统计数据到监控中心。监控中心在上面的架构图中并不是必要角色，监控中心宕机不会影响 Provider、Consumer 以及 Registry 的功能，只会丢失监控数据而已。</p>
</li>
</ul>
<h3 data-nodeid="17292" class="">搭建Dubbo源码环境</h3>

<p data-nodeid="12054">当然，要搭建Dubbo 源码环境，你首先需要下载源码。这里你可以直接从官方仓库 <a href="https://github.com/apache/dubbo" data-nodeid="12203" one-link-mark="yes">https://github.com/apache/dubbo</a>Fork 到自己的仓库，直接执行下面的命令去下载代码：</p>
<div class="course-code-area"><div class="copy-btn">复制</div><pre><code data-language="java">git clone git<span class="hljs-meta">@github</span>.com:xxxxxxxx/dubbo.git 
</code></pre></div>


<p data-nodeid="12056">然后切换分支，因为目前最新的是 Dubbo 2.7.7 版本，所以这里我们就用这个新版本：</p>
<div class="course-code-area"><div class="copy-btn">复制</div><pre><code data-language="java">git checkout -b dubbo-<span class="hljs-number">2.7</span>.<span class="hljs-number">7</span> dubbo-<span class="hljs-number">2.7</span>.<span class="hljs-number">7</span> 
</code></pre></div>

<p data-nodeid="12058">接下来，执行 mvn 命令进行编译：</p>
<div class="course-code-area"><div class="copy-btn">复制</div><pre><code data-language="java">mvn clean install -Dmaven.test.skip=<span class="hljs-keyword">true</span> 
</code></pre></div>

<p data-nodeid="12060">最后，执行下面的命令转换成 IDEA 项目：</p>
<div class="course-code-area"><div class="copy-btn">复制</div><pre><code data-language="java">mvn idea:idea <span class="hljs-comment">// 要是执行报错，就执行这个 mvn idea:workspace </span>
</code></pre></div>

<p data-nodeid="12062">然后，在 IDEA 中导入源码，因为这个导入过程中会下载所需的依赖包，所以会耗费点时间。</p>
<h3 data-nodeid="20863" class="">Dubbo源码核心模块</h3>

<p data-nodeid="22153">在 IDEA 成功导入 Dubbo 源码之后，你看到的项目结构如下图所示：</p>
<p data-nodeid="22154" class=""><img src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/Ciqc1F8eRcOAdzNmAADHxcenG7I722.png" alt="Drawing 2.png" data-nodeid="22158"></p>


<p data-nodeid="12066">下面我们就来简单介绍一下这些核心模块的功能，至于详细分析，在后面的课时中我们还会继续讲解。</p>
<ul data-nodeid="23437">
<li data-nodeid="23438">
<p data-nodeid="23439"><strong data-nodeid="23445">dubbo-common 模块：</strong> Dubbo 的一个公共模块，其中有很多工具类以及公共逻辑，例如课程后面紧接着要介绍的 Dubbo SPI 实现、时间轮实现、动态编译器等。</p>
</li>
</ul>
<p data-nodeid="23440" class=""><img src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/CgqCHl8eRfWANQSTAAHowsC6F8s134.png" alt="Drawing 4.png" data-nodeid="23448"></p>



<ul data-nodeid="24719">
<li data-nodeid="24720">
<p data-nodeid="24721"><strong data-nodeid="24727">dubbo-remoting 模块：</strong> Dubbo 的远程通信模块，其中的子模块依赖各种开源组件实现远程通信。在 dubbo-remoting-api 子模块中定义该模块的抽象概念，在其他子模块中依赖其他开源组件进行实现，例如，dubbo-remoting-netty4 子模块依赖 Netty 4 实现远程通信，dubbo-remoting-zookeeper 通过 Apache Curator 实现与 ZooKeeper 集群的交互。</p>
</li>
</ul>
<p data-nodeid="24722" class=""><img src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/Ciqc1F8eRgCAR30EAABc4PYop3w206.png" alt="Drawing 5.png" data-nodeid="24730"></p>


<ul data-nodeid="26001">
<li data-nodeid="26002">
<p data-nodeid="26003"><strong data-nodeid="26009">dubbo-rpc 模块：</strong> Dubbo 中对远程调用协议进行抽象的模块，其中抽象了各种协议，依赖于 dubbo-remoting 模块的远程调用功能。dubbo-rpc-api 子模块是核心抽象，其他子模块是针对具体协议的实现，例如，dubbo-rpc-dubbo 子模块是对 Dubbo 协议的实现，依赖了 dubbo-remoting-netty4 等 dubbo-remoting 子模块。 dubbo-rpc 模块的实现中只包含一对一的调用，不关心集群的相关内容。</p>
</li>
</ul>
<p data-nodeid="26004" class=""><img src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/Ciqc1F8eRguAA8jOAABqHomePJk138.png" alt="Drawing 6.png" data-nodeid="26012"></p>


<ul data-nodeid="27283">
<li data-nodeid="27284">
<p data-nodeid="27285"><strong data-nodeid="27293">dubbo-cluster 模块：</strong> Dubbo 中负责管理集群的模块，提供了负载均衡、容错、路由等一系列集群相关的功能，最终的目的是将多个 Provider 伪装为一个 Provider，这样 Consumer 就可以像调用一个 Provider 那样调用 Provider 集群了。</p>
</li>
<li data-nodeid="27286">
<p data-nodeid="27287"><strong data-nodeid="27298">dubbo-registry 模块：</strong> Dubbo 中负责与多种开源注册中心进行交互的模块，提供注册中心的能力。其中， dubbo-registry-api 子模块是顶层抽象，其他子模块是针对具体开源注册中心组件的具体实现，例如，dubbo-registry-zookeeper 子模块是 Dubbo 接入 ZooKeeper 的具体实现。</p>
</li>
</ul>
<p data-nodeid="27288" class=""><img src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/CgqCHl8eRhWANEiTAAB2ATuQ2vc619.png" alt="Drawing 7.png" data-nodeid="27301"></p>


<ul data-nodeid="28572">
<li data-nodeid="28573">
<p data-nodeid="28574"><strong data-nodeid="28582">dubbo-monitor 模块：</strong> Dubbo 的监控模块，主要用于统计服务调用次数、调用时间以及实现调用链跟踪的服务。</p>
</li>
<li data-nodeid="28575">
<p data-nodeid="28576"><strong data-nodeid="28587">dubbo-config 模块：</strong> Dubbo 对外暴露的配置都是由该模块进行解析的。例如，dubbo-config-api 子模块负责处理 API 方式使用时的相关配置，dubbo-config-spring 子模块负责处理与 Spring 集成使用时的相关配置方式。有了 dubbo-config 模块，用户只需要了解 Dubbo 配置的规则即可，无须了解 Dubbo 内部的细节。</p>
</li>
</ul>
<p data-nodeid="28577" class=""><img src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/CgqCHl8eRhyAVJ43AAAaPAwMeQ4525.png" alt="Drawing 8.png" data-nodeid="28590"></p>


<ul data-nodeid="29861">
<li data-nodeid="29862">
<p data-nodeid="29863"><strong data-nodeid="29869">dubbo-metadata 模块：</strong> Dubbo 的元数据模块（本课程后续会详细介绍元数据的内容）。dubbo-metadata 模块的实现套路也是有一个 api 子模块进行抽象，然后其他子模块进行具体实现。</p>
</li>
</ul>
<p data-nodeid="29864" class=""><img src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/CgqCHl8eRiSAPFIYAABXCRqgsNA891.png" alt="Drawing 9.png" data-nodeid="29872"></p>


<ul data-nodeid="31145">
<li data-nodeid="31146">
<p data-nodeid="31147"><strong data-nodeid="31153">dubbo-configcenter 模块：</strong> Dubbo 的动态配置模块，主要负责外部化配置以及服务治理规则的存储与通知，提供了多个子模块用来接入多种开源的服务发现组件。</p>
</li>
</ul>
<p data-nodeid="31148" class=""><img src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/CgqCHl8eRiuAM7LfAAA9BmMR2zY483.png" alt="Drawing 10.png" data-nodeid="31156"></p>


<h3 data-nodeid="31797" class="">Dubbo 源码中的 Demo 示例</h3>

<p data-nodeid="12101">在 Dubbo 源码中我们可以看到一个 dubbo-demo 模块，共包括三个非常基础 的 Dubbo 示例项目，分别是： <strong data-nodeid="12294">使用 XML 配置的 Demo 示例、使用注解配置的 Demo 示例</strong> 以及 <strong data-nodeid="12295">直接使用 API 的 Demo 示例</strong> 。下面我们将从这三个示例的角度，简单介绍 Dubbo 的基本使用。同时，这三个项目也将作为后续 Debug Dubbo 源码的入口，我们会根据需要在其之上进行修改 。不过在这儿之前，你需要先启动 ZooKeeper 作为注册中心，然后编写一个业务接口作为 Provider 和 Consumer 的公约。</p>
<h4 data-nodeid="32439" class="">启动 ZooKeeper</h4>

<p data-nodeid="12103">在前面 Dubbo 的架构图中，你可以看到 Provider 的地址以及配置信息是通过注册中心传递给 Consumer 的。 Dubbo 支持的注册中心尽管有很多， 但在生产环境中， <strong data-nodeid="12302">基本都是用 ZooKeeper 作为注册中心</strong> 。因此，在调试 Dubbo 源码时，自然需要在本地启动 ZooKeeper。</p>
<p data-nodeid="12104">那怎么去启动 ZooKeeper 呢？</p>
<p data-nodeid="12105">首先，你得下载 zookeeper-3.4.14.tar.gz 包（下载地址： <a href="https://archive.apache.org/dist/zookeeper/zookeeper-3.4.14/" data-nodeid="12307" one-link-mark="yes">https://archive.apache.org/dist/zookeeper/zookeeper-3.4.14/</a>）。下载完成之后执行如下命令解压缩：</p>
<div class="course-code-area"><div class="copy-btn">复制</div><pre><code data-language="java">tar -zxf zookeeper-<span class="hljs-number">3.4</span>.<span class="hljs-number">14.</span>tar.gz 
</code></pre></div>




<p data-nodeid="12107">解压完成之后，进入 zookeeper-3.4.14 目录，复制 conf/zoo_sample.cfg 文件并重命名为 conf/zoo.cfg，之后执行如下命令就可以启动 ZooKeeper了。</p>
<div class="course-code-area"><div class="copy-btn">复制</div><pre><code data-language="dart">&gt;./bin/zkServer.sh start 
# 下面为输出内容 
ZooKeeper JMX enabled by <span class="hljs-keyword">default</span> 
Using config: /Users/xxx/zookeeper<span class="hljs-number">-3.4</span><span class="hljs-number">.14</span>/bin/../conf/zoo.cfg # 配置文件 
Starting zookeeper ... STARTED # 启动成功 
</code></pre></div>











<h4 data-nodeid="42696" class="">业务接口</h4>

<p data-nodeid="12110">在使用 Dubbo 之前，你还需要一个业务接口，这个业务接口可以认为是 Dubbo Provider 和 Dubbo Consumer 的公约，反映出很多信息：</p>
<ul data-nodeid="12111">
<li data-nodeid="12112">
<p data-nodeid="12113">Provider ，如何提供服务、提供的服务名称是什么、需要接收什么参数、需要返回什么响应；</p>
</li>
<li data-nodeid="12114">
<p data-nodeid="12115">Consumer ，如何使用服务、使用的服务名称是什么、需要传入什么参数、会得到什么响应。</p>
</li>
</ul>
<p data-nodeid="43970">dubbo-demo-interface 模块就是定义业务接口的地方，如下图所示：</p>
<p data-nodeid="43971" class=""><img src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/CgqCHl8eRlWAPwvCAACx42Xn9Dk409.png" alt="Drawing 11.png" data-nodeid="43975"></p>


<p data-nodeid="12118">其中，DemoService 接口中定义了两个方法：</p>
<div class="course-code-area"><div class="copy-btn">复制</div><pre><code data-language="java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">DemoService</span> </span>{ 
    <span class="hljs-function">String <span class="hljs-title">sayHello</span><span class="hljs-params">(String name)</span></span>; <span class="hljs-comment">// 同步调用 </span>
    <span class="hljs-comment">// 异步调用 </span>
    <span class="hljs-function"><span class="hljs-keyword">default</span> CompletableFuture&lt;String&gt; <span class="hljs-title">sayHelloAsync</span><span class="hljs-params">(String name)</span> </span>{  
        <span class="hljs-keyword">return</span> CompletableFuture.completedFuture(sayHello(name)); 
    } 
} 
</code></pre></div>
<h4 data-nodeid="45256" class="">Demo 1：基于 XML 配置</h4>



<p data-nodeid="12122">在 dubbo-demo 模块下的 dubbo-demo-xml 模块，提供了基于 Spring XML 的 Provider 和 Consumer。</p>
<p data-nodeid="46526">我们先来看 dubbo-demo-xml-provider 模块，其结构如下图所示：</p>
<p data-nodeid="46527" class=""><img src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/CgqCHl8eRmKAT8LjAADV8C5fM8E391.png" alt="Drawing 12.png" data-nodeid="46531"></p>


<p data-nodeid="12125">在其 pom.xml 中除了一堆 dubbo 的依赖之外，还有依赖了 DemoService 这个公共接口：</p>
<div class="course-code-area"><div class="copy-btn">复制</div><pre><code data-language="xml"><span class="hljs-tag">&lt;<span class="hljs-name">dependency</span>&gt;</span> 
    <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>org.apache.dubbo<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span> 
    <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>dubbo-demo-interface<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span> 
    <span class="hljs-tag">&lt;<span class="hljs-name">version</span>&gt;</span>${project.parent.version}<span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span> 
<span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span> 
</code></pre></div>
<p data-nodeid="12127">DemoServiceImpl 实现了 DemoService 接口，sayHello() 方法直接返回一个字符串，sayHelloAsync() 方法返回一个 CompletableFuture 对象。</p>
<p data-nodeid="12128">在 dubbo-provider.xml 配置文件中，会将 DemoServiceImpl 配置成一个 Spring Bean，并作为 DemoService 服务暴露出去：</p>
<div class="course-code-area"><div class="copy-btn">复制</div><pre><code data-language="xml"><span class="hljs-comment">&lt;!-- 配置为 Spring Bean --&gt;</span> 
<span class="hljs-tag">&lt;<span class="hljs-name">bean</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"demoService"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"org.apache.dubbo.demo.provider.DemoServiceImpl"</span>/&gt;</span> 
<span class="hljs-comment">&lt;!-- 作为 Dubbo 服务暴露出去 --&gt;</span> 
<span class="hljs-tag">&lt;<span class="hljs-name">dubbo:service</span> <span class="hljs-attr">interface</span>=<span class="hljs-string">"org.apache.dubbo.demo.DemoService"</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">"demoService"</span>/&gt;</span> 
</code></pre></div>
<p data-nodeid="12130">还有就是指定注册中心地址（就是前面 ZooKeeper 的地址），这样 Dubbo 才能把暴露的 DemoService 服务注册到 ZooKeeper 中：</p>
<div class="course-code-area"><div class="copy-btn">复制</div><pre><code data-language="xml"><span class="hljs-comment">&lt;!-- Zookeeper 地址 --&gt;</span> 
<span class="hljs-tag">&lt;<span class="hljs-name">dubbo:registry</span> <span class="hljs-attr">address</span>=<span class="hljs-string">"zookeeper://127.0.0.1:2181"</span>/&gt;</span> 
</code></pre></div>
<p data-nodeid="12132">最后，在 Application 中写个 main() 方法，指定 Spring 配置文件并启动 ClassPathXmlApplicationContext 即可。</p>
<p data-nodeid="47800">接下来再看 dubbo-demo-xml-consumer 模块，结构如下图所示：</p>
<p data-nodeid="49740" class=""><img src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/Ciqc1F8eRnuAWnTAAAE7eBUfEoA405.png" alt="Drawing 13.png" data-nodeid="49743"></p>





<p data-nodeid="12135">在 pom.xml 中同样依赖了 dubbo-demo-interface 这个公共模块。</p>
<p data-nodeid="12136">在 dubbo-consumer.xml 配置文件中，会指定注册中心地址（就是前面 ZooKeeper 的地址），这样 Dubbo 才能从 ZooKeeper 中拉取到 Provider 暴露的服务列表信息：</p>
<div class="course-code-area"><div class="copy-btn">复制</div><pre><code data-language="xml"><span class="hljs-comment">&lt;!-- Zookeeper地址 --&gt;</span> 
<span class="hljs-tag">&lt;<span class="hljs-name">dubbo:registry</span> <span class="hljs-attr">address</span>=<span class="hljs-string">"zookeeper://127.0.0.1:2181"</span>/&gt;</span> 
</code></pre></div>
<p data-nodeid="12138">还会使用 <a href="dubbo:reference" data-nodeid="12339" one-link-mark="yes">dubbo:reference</a> 引入 DemoService 服务，后面可以作为 Spring Bean 使用：</p>
<div class="course-code-area"><div class="copy-btn">复制</div><pre><code data-language="xml"><span class="hljs-comment">&lt;!--引入DemoService服务，并配置成Spring Bean--&gt;</span> 
<span class="hljs-tag">&lt;<span class="hljs-name">dubbo:reference</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"demoService"</span> <span class="hljs-attr">check</span>=<span class="hljs-string">"false"</span>  
                 <span class="hljs-attr">interface</span>=<span class="hljs-string">"org.apache.dubbo.demo.DemoService"</span>/&gt;</span> 
</code></pre></div>
<p data-nodeid="51020">最后，在 Application 中写个 main() 方法，指定 Spring 配置文件并启动 ClassPathXmlApplicationContext 之后，就可以远程调用 Provider 端的 DemoService 的 sayHello() 方法了。</p>
<h4 data-nodeid="51342" class="">Demo 2：基于注解配置</h4>





<p data-nodeid="12143">dubbo-demo-annotation 模块是基于 Spring 注解配置的示例，无非就是将 XML 的那些配置信息转移到了注解上。</p>
<p data-nodeid="12144">我们先来看 dubbo-demo-annotation-provider 这个示例模块：</p>
<div class="course-code-area"><div class="copy-btn">复制</div><pre><code data-language="java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Application</span> </span>{ 
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> <span class="hljs-keyword">throws</span> Exception </span>{ 
	    <span class="hljs-comment">// 使用AnnotationConfigApplicationContext初始化Spring容器， </span>
        <span class="hljs-comment">// 从ProviderConfiguration这个类的注解上拿相关配置信息 </span>
        AnnotationConfigApplicationContext context =  
              <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext( 
                  ProviderConfiguration.class); 
        context.start(); 
        System.in.read(); 
    } 
    <span class="hljs-meta">@Configuration</span> <span class="hljs-comment">// 配置类 </span>
    <span class="hljs-comment">// @EnableDubbo注解指定包下的Bean都会被扫描，并做Dubbo服务暴露出去 </span>
    <span class="hljs-meta">@EnableDubbo(scanBasePackages = "org.apache.dubbo.demo.provider")</span>      
    <span class="hljs-comment">// @PropertySource注解指定了其他配置信息 </span>
    <span class="hljs-meta">@PropertySource("classpath:/spring/dubbo-provider.properties")</span>      
    <span class="hljs-keyword">static</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ProviderConfiguration</span> </span>{ 
        <span class="hljs-meta">@Bean</span> 
        <span class="hljs-function"><span class="hljs-keyword">public</span> RegistryConfig <span class="hljs-title">registryConfig</span><span class="hljs-params">()</span> </span>{ 
            RegistryConfig registryConfig = <span class="hljs-keyword">new</span> RegistryConfig(); 
            registryConfig.setAddress(<span class="hljs-string">"zookeeper://127.0.0.1:2181"</span>); 
            <span class="hljs-keyword">return</span> registryConfig; 
        } 
    } 
} 
</code></pre></div>
<p data-nodeid="51980">这里，同样会有一个 DemoServiceImpl 实现了 DemoService 接口，并且在 org.apache.dubbo.demo.provider 目录下，能被扫描到，暴露成 Dubbo 服务。</p>
<p data-nodeid="51981">接着再来看 dubbo-demo-annotation-consumer 模块，其中 Application 中也是通过 AnnotationConfigApplicationContext 初始化 Spring 容器，也会扫描指定目录下的 Bean，会扫到 DemoServiceComponent 这个 Bean，其中就通过 @Reference 注解注入 Dubbo 服务相关的 Bean：</p>

<div class="course-code-area"><div class="copy-btn">复制</div><pre><code data-language="java"><span class="hljs-meta">@Component("demoServiceComponent")</span> 
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DemoServiceComponent</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">DemoService</span> </span>{ 
    <span class="hljs-meta">@Reference</span> <span class="hljs-comment">// 注入Dubbo服务 </span>
    <span class="hljs-keyword">private</span> DemoService demoService; 
    <span class="hljs-meta">@Override</span> 
    <span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">sayHello</span><span class="hljs-params">(String name)</span> </span>{ 
        <span class="hljs-keyword">return</span> demoService.sayHello(name); 
    } 
	  <span class="hljs-comment">// 其他方法 </span>
} 
</code></pre></div>
<h4 data-nodeid="53256" class="">Demo 3：基于 API 配置</h4>



<p data-nodeid="12150">在有的场景中，不能依赖于 Spring 框架，只能使用 API 来构建 Dubbo Provider 和 Consumer，比较典型的一种场景就是在写 SDK 的时候。</p>
<p data-nodeid="12151">先来看 dubbo-demo-api-provider 模块，其中 Application.main() 方法是入口：</p>
<div class="course-code-area"><div class="copy-btn">复制</div><pre><code data-language="java"><span class="hljs-comment">// 创建一个ServiceConfig的实例，泛型参数是业务接口实现类， </span>
<span class="hljs-comment">// 即DemoServiceImpl </span>
ServiceConfig&lt;DemoServiceImpl&gt; service = <span class="hljs-keyword">new</span> ServiceConfig&lt;&gt;(); 
<span class="hljs-comment">// 指定业务接口 </span>
service.setInterface(DemoService.class); 
// 指定业务接口的实现，由该对象来处理Consumer的请求 
service.setRef(<span class="hljs-keyword">new</span> DemoServiceImpl()); 
<span class="hljs-comment">// 获取DubboBootstrap实例，这是个单例的对象 </span>
DubboBootstrap bootstrap = DubboBootstrap.getInstance(); 
<span class="hljs-comment">//生成一个 ApplicationConfig 的实例、指定ZK地址以及ServiceConfig实例 </span>
bootstrap.application(<span class="hljs-keyword">new</span> ApplicationConfig(<span class="hljs-string">"dubbo-demo-api-provider"</span>)) 
        .registry(<span class="hljs-keyword">new</span> RegistryConfig(<span class="hljs-string">"zookeeper://127.0.0.1:2181"</span>)) 
        .service(service) 
        .start() 
        .await(); 
</code></pre></div>

<p data-nodeid="54527">这里，同样会有一个 DemoServiceImpl 实现了 DemoService 接口，并且在 org.apache.dubbo.demo.provider 目录下，能被扫描到，暴露成 Dubbo 服务。</p>
<p data-nodeid="54528">再来看 dubbo-demo-api-consumer 模块，其中 Application 中包含一个普通的 main() 方法入口：</p>

<div class="course-code-area"><div class="copy-btn">复制</div><pre><code data-language="java">&nbsp;<span class="hljs-comment">// 创建ReferenceConfig,其中指定了引用的接口DemoService </span>
&nbsp;ReferenceConfig&lt;DemoService&gt; reference = <span class="hljs-keyword">new</span> ReferenceConfig&lt;&gt;(); 
&nbsp;reference.setInterface(DemoService.class); 
&nbsp;reference.setGeneric("<span class="hljs-keyword">true</span>"); 
&nbsp; 
&nbsp;// 创建DubboBootstrap，指定ApplicationConfig以及RegistryConfig 
&nbsp;DubboBootstrap bootstrap = DubboBootstrap.getInstance(); 
&nbsp;bootstrap.application(<span class="hljs-keyword">new</span> ApplicationConfig(<span class="hljs-string">"dubbo-demo-api-consumer"</span>)) 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.registry(<span class="hljs-keyword">new</span> RegistryConfig(<span class="hljs-string">"zookeeper://127.0.0.1:2181"</span>)) 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.reference(reference) 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.start(); 
&nbsp;<span class="hljs-comment">// 获取DemoService实例并调用其方法 </span>
&nbsp;DemoService demoService = ReferenceConfigCache.getCache() 
    .get(reference); 
&nbsp;String message = demoService.sayHello(<span class="hljs-string">"dubbo"</span>); 
&nbsp;System.out.println(message); 
</code></pre></div>

<h3 data-nodeid="55800" class="">总结</h3>

<p data-nodeid="12156">在本课时，我们首先介绍了 Dubbo 的核心架构以及各核心组件的功能，接下来又搭建了 Dubbo 源码环境，并详细介绍了 Dubbo 核心模块的功能，为后续分析 Dubbo 源码打下了基础。最后我们还深入分析了 Dubbo 源码中自带的三个 Demo 示例，现在你就可以以这三个 Demo 示例为入口 Debug Dubbo 源码了。</p>
<p data-nodeid="12157">在后面的课时中，我们将解决几个问题：Dubbo 是如何与 ZooKeeper 等注册中心进行交互的？Provider 与 Consumer 之间是如何交互的？为什么我们在编写业务代码的时候，感受不到任何网络交互？Dubbo Provider 发布到注册中心的数据是什么？Consumer 为何能正确识别？两者的统一契约是什么？这个契约是如何做到可扩展的？这个契约还会用在 Dubbo 的哪些地方？这些问题你也可以提前思考一下，在后面的课程中我会一一为你解答。</p></div></div></div> <div data-v-84b38976="" class="el-dialog__wrapper" style="display: none;"><div role="dialog" aria-modal="true" aria-label="dialog" class="el-dialog el-dialog--center show-img-wrap" style="margin-top: 15vh; width: 60%;"><div class="el-dialog__header"><span class="el-dialog__title"></span><button type="button" aria-label="Close" class="el-dialog__headerbtn"><i class="el-dialog__close el-icon el-icon-close"></i></button></div><!----><!----></div></div></div> <div data-v-7ae8acec="" class="fix-box-wrap"><div data-v-7ae8acec="" class="mini-player-wrap"><div data-v-c52c5236="" data-v-7ae8acec="" class="player-container-wrap"><div data-v-c52c5236="" class="player"><div data-v-c52c5236="" class="close-btn"></div> <div data-v-c52c5236="" class="content"><div data-v-c52c5236="" class="theme single-line narrow-theme">
                
            </div> <div data-v-c52c5236="" class="time-course"><div data-v-c52c5236="" class="time">
                    00:00<span data-v-c52c5236="" class="line"></span></div> <span data-v-c52c5236="" class="course-name single-line">Dubbo源码解读与实战</span></div></div> <div data-v-c52c5236="" class="player-container"><div data-v-c52c5236="" class="play-btn"><div data-v-c52c5236="" class="play-status playing"></div></div> <div data-v-c52c5236="" class="play-next next-unable"></div></div></div></div></div> <!----></div> <div data-v-7ae8acec="" class="right-content-space"></div> <div data-v-7ae8acec="" class="right-content-message"><div data-v-681ea2f8="" data-v-7ae8acec="" class="message pc-message"><div data-v-681ea2f8="" class="message-topic"><div data-v-681ea2f8="" class="message-topic-title">
            精选留言
        </div> <div data-v-681ea2f8="" class="message-topic-write pointer"><img data-v-681ea2f8="" src="" class="message-topic-write-icon">
            写留言
        </div></div> <!----> <!---->  <div data-v-681ea2f8="" class="message-list"><div data-v-681ea2f8="" class="message-list-title"><div data-v-681ea2f8="" class="message-list-title-left"><div data-v-681ea2f8="" class="message-list-title-left-name">
                    **狗
                </div> <div data-v-681ea2f8="" class="message-list-title-left-tag">
                    
                </div></div> <div data-v-681ea2f8="" class="message-list-title-right"><!----> <img data-v-681ea2f8="" src="" alt="right-icon" class="message-list-title-right-icon"> <div data-v-681ea2f8="" class="message-list-title-right-praise">
                    27
                </div></div></div> <div data-v-681ea2f8="" class="message-list-content">课程讲解很详细，期待老师尽快更新，谢谢~期待自己，跟着课程深入原理，举一反三！</div> <!----> <!----></div><div data-v-681ea2f8="" class="message-list"><div data-v-681ea2f8="" class="message-list-title"><div data-v-681ea2f8="" class="message-list-title-left"><div data-v-681ea2f8="" class="message-list-title-left-name">
                    *奥
                </div> <div data-v-681ea2f8="" class="message-list-title-left-tag">
                    
                </div></div> <div data-v-681ea2f8="" class="message-list-title-right"><!----> <img data-v-681ea2f8="" src="" alt="right-icon" class="message-list-title-right-icon"> <div data-v-681ea2f8="" class="message-list-title-right-praise">
                    20
                </div></div></div> <div data-v-681ea2f8="" class="message-list-content">认真学习，缩小差距</div> <!----> <!----></div><div data-v-681ea2f8="" class="message-list"><div data-v-681ea2f8="" class="message-list-title"><div data-v-681ea2f8="" class="message-list-title-left"><div data-v-681ea2f8="" class="message-list-title-left-name">
                    *晴
                </div> <div data-v-681ea2f8="" class="message-list-title-left-tag">
                    
                </div></div> <div data-v-681ea2f8="" class="message-list-title-right"><!----> <img data-v-681ea2f8="" src="" alt="right-icon" class="message-list-title-right-icon"> <div data-v-681ea2f8="" class="message-list-title-right-praise">
                    15
                </div></div></div> <div data-v-681ea2f8="" class="message-list-content">沙发，跟着老师花几个月搞定Dubbo！</div> <!----> <!----></div><div data-v-681ea2f8="" class="message-list"><div data-v-681ea2f8="" class="message-list-title"><div data-v-681ea2f8="" class="message-list-title-left"><div data-v-681ea2f8="" class="message-list-title-left-name">
                    **泽
                </div> <div data-v-681ea2f8="" class="message-list-title-left-tag">
                    
                </div></div> <div data-v-681ea2f8="" class="message-list-title-right"><!----> <img data-v-681ea2f8="" src="" alt="right-icon" class="message-list-title-right-icon"> <div data-v-681ea2f8="" class="message-list-title-right-praise">
                    7
                </div></div></div> <div data-v-681ea2f8="" class="message-list-content">当一名 Java 工程师，Dubbo肯定得加入学习目录里，现在好多大厂都在用。</div> <!----> <!----></div><div data-v-681ea2f8="" class="message-list"><div data-v-681ea2f8="" class="message-list-title"><div data-v-681ea2f8="" class="message-list-title-left"><div data-v-681ea2f8="" class="message-list-title-left-name">
                    **用户8622
                </div> <div data-v-681ea2f8="" class="message-list-title-left-tag">
                    
                </div></div> <div data-v-681ea2f8="" class="message-list-title-right"><!----> <img data-v-681ea2f8="" src="" alt="right-icon" class="message-list-title-right-icon"> <div data-v-681ea2f8="" class="message-list-title-right-praise">
                    1
                </div></div></div> <div data-v-681ea2f8="" class="message-list-content">讲解的非常细致 图文做的也很用心 谢谢老师和拉钩的编辑</div> <div data-v-681ea2f8="" class="message-list-replay"><span data-v-681ea2f8="" class="message-list-replay-name">编辑回复：</span>
            谢谢您的支持
        </div> <!----></div><div data-v-681ea2f8="" class="message-list"><div data-v-681ea2f8="" class="message-list-title"><div data-v-681ea2f8="" class="message-list-title-left"><div data-v-681ea2f8="" class="message-list-title-left-name">
                    *宇
                </div> <div data-v-681ea2f8="" class="message-list-title-left-tag">
                    
                </div></div> <div data-v-681ea2f8="" class="message-list-title-right"><!----> <img data-v-681ea2f8="" src="" alt="right-icon" class="message-list-title-right-icon"> <div data-v-681ea2f8="" class="message-list-title-right-praise">
                    1
                </div></div></div> <div data-v-681ea2f8="" class="message-list-content">2020-08-04打卡</div> <!----> <!----></div><div data-v-681ea2f8="" class="message-list"><div data-v-681ea2f8="" class="message-list-title"><div data-v-681ea2f8="" class="message-list-title-left"><div data-v-681ea2f8="" class="message-list-title-left-name">
                    *寒
                </div> <div data-v-681ea2f8="" class="message-list-title-left-tag">
                    
                </div></div> <div data-v-681ea2f8="" class="message-list-title-right"><!----> <img data-v-681ea2f8="" src="" alt="right-icon" class="message-list-title-right-icon"> <div data-v-681ea2f8="" class="message-list-title-right-praise">
                    1
                </div></div></div> <div data-v-681ea2f8="" class="message-list-content">刚好跟我的工作业务相关，得赶紧补补课了。</div> <!----> <!----></div><div data-v-681ea2f8="" class="message-list"><div data-v-681ea2f8="" class="message-list-title"><div data-v-681ea2f8="" class="message-list-title-left"><div data-v-681ea2f8="" class="message-list-title-left-name">
                    **刚
                </div> <div data-v-681ea2f8="" class="message-list-title-left-tag">
                    
                </div></div> <div data-v-681ea2f8="" class="message-list-title-right"><!----> <img data-v-681ea2f8="" src="" alt="right-icon" class="message-list-title-right-icon"> <div data-v-681ea2f8="" class="message-list-title-right-praise">
                    
                </div></div></div> <div data-v-681ea2f8="" class="message-list-content">第一次看源码，不错</div> <!----> <!----></div><div data-v-681ea2f8="" class="message-list"><div data-v-681ea2f8="" class="message-list-title"><div data-v-681ea2f8="" class="message-list-title-left"><div data-v-681ea2f8="" class="message-list-title-left-name">
                    **7117
                </div> <div data-v-681ea2f8="" class="message-list-title-left-tag">
                    
                </div></div> <div data-v-681ea2f8="" class="message-list-title-right"><!----> <img data-v-681ea2f8="" src="" alt="right-icon" class="message-list-title-right-icon"> <div data-v-681ea2f8="" class="message-list-title-right-praise">
                    
                </div></div></div> <div data-v-681ea2f8="" class="message-list-content">什么时候更新呀？</div> <div data-v-681ea2f8="" class="message-list-replay"><span data-v-681ea2f8="" class="message-list-replay-name">编辑回复：</span>
            每周二、五更新哦~
        </div> <!----></div><div data-v-681ea2f8="" class="message-list"><div data-v-681ea2f8="" class="message-list-title"><div data-v-681ea2f8="" class="message-list-title-left"><div data-v-681ea2f8="" class="message-list-title-left-name">
                    *雪
                </div> <div data-v-681ea2f8="" class="message-list-title-left-tag">
                    
                </div></div> <div data-v-681ea2f8="" class="message-list-title-right"><!----> <img data-v-681ea2f8="" src="" alt="right-icon" class="message-list-title-right-icon"> <div data-v-681ea2f8="" class="message-list-title-right-praise">
                    
                </div></div></div> <div data-v-681ea2f8="" class="message-list-content">认真学习</div> <!----> <!----></div><div data-v-681ea2f8="" class="message-list"><div data-v-681ea2f8="" class="message-list-title"><div data-v-681ea2f8="" class="message-list-title-left"><div data-v-681ea2f8="" class="message-list-title-left-name">
                    **先
                </div> <div data-v-681ea2f8="" class="message-list-title-left-tag">
                    
                </div></div> <div data-v-681ea2f8="" class="message-list-title-right"><!----> <img data-v-681ea2f8="" src="" alt="right-icon" class="message-list-title-right-icon"> <div data-v-681ea2f8="" class="message-list-title-right-praise">
                    
                </div></div></div> <div data-v-681ea2f8="" class="message-list-content">动手写过一个基于 Netty 的超简单 RPC</div> <!----> <!----></div><div data-v-681ea2f8="" class="message-list"><div data-v-681ea2f8="" class="message-list-title"><div data-v-681ea2f8="" class="message-list-title-left"><div data-v-681ea2f8="" class="message-list-title-left-name">
                    **豪
                </div> <div data-v-681ea2f8="" class="message-list-title-left-tag">
                    
                </div></div> <div data-v-681ea2f8="" class="message-list-title-right"><!----> <img data-v-681ea2f8="" src="" alt="right-icon" class="message-list-title-right-icon"> <div data-v-681ea2f8="" class="message-list-title-right-praise">
                    
                </div></div></div> <div data-v-681ea2f8="" class="message-list-content">去年就使用过dubbo+spring boot开发，对于dubbo源码有过了解，希望可以在这里学习后有更清晰的认识～😁</div> <!----> <!----></div><div data-v-681ea2f8="" class="message-list"><div data-v-681ea2f8="" class="message-list-title"><div data-v-681ea2f8="" class="message-list-title-left"><div data-v-681ea2f8="" class="message-list-title-left-name">
                    *鹏
                </div> <div data-v-681ea2f8="" class="message-list-title-left-tag">
                    
                </div></div> <div data-v-681ea2f8="" class="message-list-title-right"><!----> <img data-v-681ea2f8="" src="" alt="right-icon" class="message-list-title-right-icon"> <div data-v-681ea2f8="" class="message-list-title-right-praise">
                    
                </div></div></div> <div data-v-681ea2f8="" class="message-list-content">挺好</div> <!----> <!----></div><div data-v-681ea2f8="" class="message-list"><div data-v-681ea2f8="" class="message-list-title"><div data-v-681ea2f8="" class="message-list-title-left"><div data-v-681ea2f8="" class="message-list-title-left-name">
                    *峰
                </div> <div data-v-681ea2f8="" class="message-list-title-left-tag">
                    
                </div></div> <div data-v-681ea2f8="" class="message-list-title-right"><!----> <img data-v-681ea2f8="" src="" alt="right-icon" class="message-list-title-right-icon"> <div data-v-681ea2f8="" class="message-list-title-right-praise">
                    
                </div></div></div> <div data-v-681ea2f8="" class="message-list-content">干得漂亮</div> <!----> <!----></div><div data-v-681ea2f8="" class="message-list"><div data-v-681ea2f8="" class="message-list-title"><div data-v-681ea2f8="" class="message-list-title-left"><div data-v-681ea2f8="" class="message-list-title-left-name">
                    **兰
                </div> <div data-v-681ea2f8="" class="message-list-title-left-tag">
                    
                </div></div> <div data-v-681ea2f8="" class="message-list-title-right"><!----> <img data-v-681ea2f8="" src="" alt="right-icon" class="message-list-title-right-icon"> <div data-v-681ea2f8="" class="message-list-title-right-praise">
                    
                </div></div></div> <div data-v-681ea2f8="" class="message-list-content">想进大厂，Dubbo 可不得赶紧学起来。</div> <!----> <!----></div><div data-v-681ea2f8="" class="message-list"><div data-v-681ea2f8="" class="message-list-title"><div data-v-681ea2f8="" class="message-list-title-left"><div data-v-681ea2f8="" class="message-list-title-left-name">
                    **境
                </div> <div data-v-681ea2f8="" class="message-list-title-left-tag">
                    
                </div></div> <div data-v-681ea2f8="" class="message-list-title-right"><!----> <img data-v-681ea2f8="" src="" alt="right-icon" class="message-list-title-right-icon"> <div data-v-681ea2f8="" class="message-list-title-right-praise">
                    
                </div></div></div> <div data-v-681ea2f8="" class="message-list-content">大佬牛逼，获益匪浅</div> <!----> <!----></div><div data-v-681ea2f8="" class="message-list"><div data-v-681ea2f8="" class="message-list-title"><div data-v-681ea2f8="" class="message-list-title-left"><div data-v-681ea2f8="" class="message-list-title-left-name">
                    *琦
                </div> <div data-v-681ea2f8="" class="message-list-title-left-tag">
                    
                </div></div> <div data-v-681ea2f8="" class="message-list-title-right"><!----> <img data-v-681ea2f8="" src="" alt="right-icon" class="message-list-title-right-icon"> <div data-v-681ea2f8="" class="message-list-title-right-praise">
                    
                </div></div></div> <div data-v-681ea2f8="" class="message-list-content">学习一下！dubbo</div> <!----> <!----></div> <!----></div></div></div></div></div></div> <video data-v-5753ad1c="" id="video" controls="controls" x-webkit-airplay="true" x5-video-player-fullscreen="true" preload="auto" playsinline="true" webkit-playsinline="" x5-video-player-type="h5" class="video vjs-default-skin"><source data-v-5753ad1c="" type="application/x-mpegURL" src=""></video> <div data-v-a56b928a="" data-v-6dd07dce=""><div data-v-f8659a78="" data-v-a56b928a="" class="modal" style="display: none;"><div data-v-f8659a78="" class="modal-content"><button data-v-f8659a78="" class="close"></button> <div data-v-f8659a78="" class="title-content"><div data-v-f8659a78="" class="title">
                拉勾教育
            </div> <div data-v-f8659a78="" class="desc">
                互联网实战大学
            </div></div> <div data-v-f8659a78="" class="account-container"><ul data-v-f8659a78="" class="account-title-c"><li data-v-f8659a78="" class="account-s account-active"><span data-v-f8659a78="" class="account-text">手机号登录</span></li> <li data-v-f8659a78="" class="account-s"><span data-v-f8659a78="" class="account-text">账户密码登录</span></li></ul> <!----> <div data-v-f8659a78="" class="form-area"><div data-v-f8659a78="" class="forms-top-wrapper"><div data-v-f8659a78="" class="forms-top-code"><form data-v-f8659a78="" action="https://kaiwu.lagou.com/course/courseInfo.htm?courseId=393"><div data-v-f8659a78="" class="input-item"><span data-v-f8659a78="" class="area-code">0086</span> <div data-v-3959ee0f="" data-v-f8659a78="" class="code-list-wrap login-phone" style="display: none;"><div data-v-3959ee0f=""><div data-v-3959ee0f="" class="tips">
            常用
        </div> <div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">中国</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">0086</span></div><div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">中国香港</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">00852</span></div><div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">中国台湾</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">00886</span></div><div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">中国澳门</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">00853</span></div><div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">美国</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">001</span></div></div><div data-v-3959ee0f=""><div data-v-3959ee0f="" class="tips">
            A
        </div> <div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">澳大利亚</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">0061</span></div><div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">中国澳门</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">00853</span></div><div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">爱尔兰</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">00353</span></div></div><div data-v-3959ee0f=""><div data-v-3959ee0f="" class="tips">
            B
        </div> <div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">巴西</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">0055</span></div></div><div data-v-3959ee0f=""><div data-v-3959ee0f="" class="tips">
            D
        </div> <div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">德国</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">0049</span></div></div><div data-v-3959ee0f=""><div data-v-3959ee0f="" class="tips">
            E
        </div> <div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">俄罗斯</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">007</span></div></div><div data-v-3959ee0f=""><div data-v-3959ee0f="" class="tips">
            F
        </div> <div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">法国</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">0033</span></div></div><div data-v-3959ee0f=""><div data-v-3959ee0f="" class="tips">
            H
        </div> <div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">韩国</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">0082</span></div><div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">荷兰</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">0031</span></div></div><div data-v-3959ee0f=""><div data-v-3959ee0f="" class="tips">
            J
        </div> <div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">加拿大</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">001</span></div></div><div data-v-3959ee0f=""><div data-v-3959ee0f="" class="tips">
            M
        </div> <div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">马来西亚</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">0060</span></div><div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">美国</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">001</span></div></div><div data-v-3959ee0f=""><div data-v-3959ee0f="" class="tips">
            R
        </div> <div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">日本</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">0081</span></div></div><div data-v-3959ee0f=""><div data-v-3959ee0f="" class="tips">
            T
        </div> <div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">中国台湾</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">00886</span></div><div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">泰国</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">0066</span></div></div><div data-v-3959ee0f=""><div data-v-3959ee0f="" class="tips">
            X
        </div> <div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">中国香港</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">00852</span></div><div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">新加坡</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">0065</span></div><div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">新西兰</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">0064</span></div></div><div data-v-3959ee0f=""><div data-v-3959ee0f="" class="tips">
            Y
        </div> <div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">印度</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">0091</span></div><div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">英国</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">0044</span></div><div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">越南</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">0084</span></div><div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">印度尼西亚</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">0062</span></div></div><div data-v-3959ee0f=""><div data-v-3959ee0f="" class="tips">
            Z
        </div> <div data-v-3959ee0f="" class="click-item"><span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-name">中国</span> <span data-v-f8659a78="" data-v-3959ee0f="" class="area-code-code">0086</span></div></div> <div data-v-f8659a78="" data-v-3959ee0f="" class="end-tips">
                                            如果没有找到您的所在归属地，请拨打客服电话4006282835解决。
                                        </div></div> <input data-v-f8659a78="" name="" type="tel" placeholder="请输入常用手机号" data-required="required" autocomplete="off" class="input login-enter-phone"> <div data-v-f8659a78="" class="input-tips" style="display: none;">
                                    
                                </div> <div data-v-f8659a78="" class="clear" style="display: none;"></div></div> <div data-v-f8659a78="" class="input-item"><input data-v-f8659a78="" type="text" name="" placeholder="请输入验证码" maxlength="6" data-required="required" autocomplete="off" class="input login-enter-code"> <button data-v-f8659a78="" class="require-code">
                                    获取验证码
                                </button> <div data-v-f8659a78="" class="input-tips" style="display: none;">
                                    
                                </div></div></form> <form data-v-f8659a78="" action="https://kaiwu.lagou.com/course/courseInfo.htm?courseId=393" style="display: none;"><div data-v-f8659a78="" class="input-item"><input data-v-f8659a78="" placeholder="请输入常用手机号/邮箱" data-required="required" autocomplete="off" class="input"> <div data-v-f8659a78="" class="input-tips" style="display: none;">
                                    
                                </div> <div data-v-f8659a78="" class="clear" style="display: none;"></div></div> <div data-v-f8659a78="" class="input-item"><input data-v-f8659a78="" type="password" placeholder="请输入密码" data-required="required" autocomplete="off" class="input"> <div data-v-f8659a78="" class="input-tips" style="display: none;">
                                    
                                </div> <div data-v-f8659a78="" class="clear" style="display: none;"></div></div></form></div> <button data-v-f8659a78="" class="login-btn">
                        登录
                    </button> <!----> <a data-v-f8659a78="" class="we-chat-c" one-link-mark="yes"><img data-v-f8659a78="" src="" alt="" class="we-chat-i"> <span data-v-f8659a78="" class="we-chat-s">微信扫码登录</span></a></div></div></div></div></div></div> <div><!----> <!----> <!----> <div data-v-51f7ab0d="" class="vux-alert purchase-alert-container" current-environment="PC"><div class="vux-x-dialog"><div class="weui-mask" style="display: none;"></div> <div class="weui-dialog" style="display: none;"><div class="weui-dialog__hd"><strong class="weui-dialog__title">购买成功</strong></div> <div class="weui-dialog__bd"><div data-v-51f7ab0d="" class="purchase-alert-content"><img data-v-51f7ab0d="" src="" alt="购买成功" class="purchase-success-img"></div></div> <div class="weui-dialog__ft"><a href="javascript:;" class="weui-dialog__btn weui-dialog__btn_primary" one-link-mark="yes">我知道了</a></div></div></div></div> <!----> <!----> <!----> <!----> <div data-v-9641c000="" class="pc-all-dirlog-wrap"><div data-v-467635e0="" data-v-9641c000="" class="el-dialog__wrapper sale-pc-all-dirlog" style="display: none;"><div role="dialog" aria-modal="true" aria-label="dialog" class="el-dialog el-dialog--center" style="margin-top: 25vh; width: 500px;"><div class="el-dialog__header"><span class="el-dialog__title"></span><button type="button" aria-label="Close" class="el-dialog__headerbtn"><i class="el-dialog__close el-icon el-icon-close"></i></button></div><!----><!----></div></div></div></div></div>
<!-- 如需在IE8、9浏览器中初始化播放器，浏览器需支持Flash并在页面中引入 -->
<!--[if lt IE 9]>
<script src="//imgcache.qq.com/open/qcloud/video/tcplayer/ie8/videojs-ie8.js"></script>
<![endif]-->

<script id="_lgpassport_" data-css-site="0" data-css-popup="0" type="text/javascript" src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/passport.js"></script>

<script type="text/javascript">
    //后端变量赋值
        window.courseInfo = {"id":393,"courseCId":"","courseName":"Dubbo源码解读与实战","teachers":[{"id":395,"teacherName":"杨四正","position":"资深技术专家，源码剖析畅销书作者","teacherHeadPicUrl":"https://s0.lgstatic.com/i/image/M00/38/66/Ciqc1F8dYO2AU20SAAAONXSRtnA053.png","description":"<p><span style=\"font-family: 微软雅黑, &quot;Microsoft YaHei&quot;; font-size: 14px;\">多年互联网一线开发经验，曾在多家互联网企业任职，涉及电商、新零售、短视频、直播等多个领域。参与公司多款中间件开发，工作中深入研究并改造过多种开源产品的实现，在架构设计方面经验丰富。</span></p>"}],"totalCourseTime":26,"totalDuration":400,"sales":16487,"price":"98","priceTag":"立即购买","discounts":"98","discountsTag":"立即购买","courseImgUrl":"https://s0.lgstatic.com/i/image/M00/38/66/Ciqc1F8dYO2AU20SAAAONXSRtnA053.png","sellGoodsId":395,"sellGoodsPriceId":1557,"lgCoinPrice":98,"isBuy":false,"isFavorite":false,"isNewDes":"","seoDescription":"近年来各大互联网公司都因业务复杂化，在落地微服务架构。Dubbo 作为一款高性能、轻量级的 RPC 框架，正好能解决微服务架构落地中遇到的各种问题。本专栏以结合实战的方式深度解读 Dubbo 源码，理解核心功能实现，再带你使用这些核心技术，通过编写一个简易版本的 RPC 框架串联所有知识点，更好地应对实战。","seoKeywords":"Dubbo,后端开发,RPC 框架,Java,Spring Cloud,Dubbo SPI,分布式,微服务,远程服务调用,集群,架构,架构师,Netty,ZooKeeper,Curator,ZkClient,序列化算法,动态代理,事件驱动,注册中心,本地缓存,重试机制,元数据,RPC,remoting,Protocol,Proxy,Filter,Clustr,集群容错,负载均衡,路由机制,Monitor,Mock,Plugin","seoTitle":"Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育","shareTitle":"直击 Dubbo 原理与实现，提升实战开发能力","shareDescription":"掌握分布式服务框架，紧跟微服务潮流","brief":"掌握框架底层源码，提升实战开发能力","courseListImg":"https://s0.lgstatic.com/i/image/M00/44/E5/Ciqc1F8_k2qAfGFoAABLQgwJtbM707.png","courseType":1,"previewFirstField":"共26讲","previewSecondField":"周 二、五 更新","joinMember":false,"freeForVip":true,"decorateId":152,"successShowType":"WEI_XIN","weixinQrUrl":"https://s0.lgstatic.com/i/image/M00/51/33/Ciqc1F9kkASAVxyiAAQZpJsm9Ps775.png","appDecorateId":152,"recruitAppDecorateId":152,"joinSeckill":false,"seckillRemainSeconds":"0","synEnterprise":false};
            window.isLogin = true;
            window.sellGoodsPriceId = -1;
            window.orderToken = '4070af4d6eda4d0c9b762c2bd343a13a';
            window.userInfo = {"id":16904644,"nickName":"用户0778","isActive":0,"portrait":"https://s0.lgstatic.com/images/myresume/default_headpic.png"};
            window.enterNewPage = false;
                window.activityButtonInfo = null;
    
</script>

<!---->
<!---->





    <script type="text/javascript" src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/vendor.424fdf064e46228ef60d.dll.js" crossorigin="anonymous"></script>
    <script src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/main.9163723.js" crossorigin="anonymous"></script><script src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/common.4dcfa6e.js" crossorigin="anonymous"></script><script src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/main_big-data-s_899d65fb.4a0e664.js" crossorigin="anonymous"></script><script src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/main.2568db5.js" crossorigin="anonymous"></script><div class="lg-pay lg-recharge-pay-container">
    <div class="lg-pay-container recharge-pay-container">
        <div class="lg-pay-close"></div>
        <div class="modal-payment-title">
            <i class="icon-hd"></i>
            <span class="title-text">已开启安全支付</span>
        </div>
        <div class="recharge-pay-title">请选择支付方式</div>
        <div class="pay-methods">
                    <div class="pay-method-list">
                        <div class="lg-pay-select lg-pay-select-ali pay-method-item pay-ali active">
                            <i class="pay-icon-ali"></i>
                            <span class="pay-method-name">支付宝支付</span>
                        </div>
                        <div class="lg-pay-select lg-pay-select-wx pay-method-item pay-wx ">
                            <i class="pay-icon-wx"></i>
                            <span class="pay-method-name">微信支付</span>
                        </div>
                    </div>
                </div>
                <div class="lg-pay-qrcode lg-pay-qrcode-wx">
                    <canvas id="wxQrcode"></canvas>
                </div>
                <div class="lg-pay-qrcode lg-pay-qrcode-ali" style="display:block">
                    <canvas id="aliQrcode"></canvas>
                </div>
                <div class="pay-qrcode-label">
                    <span>请使用<span class="channel-text">支付宝支付</span>：</span>
                    <span>
                    <span class="price-container">
                        <span class="pay-qrcode-label-money">100元</span>
                        <span class="real-price">100元</span>
                        <div class="coupon-info">
                            首单立减20
                        </div>
                    </span>
                    <span class="original-price">1000</span>
                   
                    </span>
                  
                </div>
                <div class="pay-qrcode-status">
                    <span>
                        <span class="left-text">未支付成功，请重新扫码支付</span>
                        <a class="link" one-link-mark="yes">我已完成支付</a>
                    </span>
                </div>
                <div class="pay-notes">
                    <span>付费即表示同意<a href="https://activity.lagou.com/app/business/service-agreement.html" }="" target="_blank" one-link-mark="yes">《拉勾网在线增值服务协议》</a></span>
                </div>
    </div>
</div><div class="lg-pay-recharge" style="display: none;">
    <div class="lg-pay-container lg-pay-recharge-confirm">
        <div class="lg-pay-close"></div>
        <div class="recharge-title">勾豆充值</div>
        <div>
            <div class="recharge-label">填写充值勾豆数量</div>
            <div class="recharge-amount">
                <input type="text" class="amount input" min="0" max="9999" value="100">
            </div>
        </div>
        <div class="recharge-tips">
            需支付：<span class="count-show">100元</span><span class="recharge-description">（1元=1勾豆）</span>
        </div>
        <div class="recharge-btn">立即充值</div>
    </div>
</div><div class="lg-pay lg-recharge-pay-container">
    <div class="lg-pay-container recharge-pay-container">
        <div class="lg-pay-close"></div>
        <div class="modal-payment-title">
            <i class="icon-hd"></i>
            <span class="title-text">已开启安全支付</span>
        </div>
        <div class="recharge-pay-title">请选择支付方式</div>
        <div class="pay-methods">
                    <div class="pay-method-list">
                        <div class="lg-pay-select lg-pay-select-ali pay-method-item pay-ali active">
                            <i class="pay-icon-ali"></i>
                            <span class="pay-method-name">支付宝支付</span>
                        </div>
                        <div class="lg-pay-select lg-pay-select-wx pay-method-item pay-wx ">
                            <i class="pay-icon-wx"></i>
                            <span class="pay-method-name">微信支付</span>
                        </div>
                    </div>
                </div>
                <div class="lg-pay-qrcode lg-pay-qrcode-wx">
                    <canvas id="wxQrcode"></canvas>
                </div>
                <div class="lg-pay-qrcode lg-pay-qrcode-ali" style="display:block">
                    <canvas id="aliQrcode"></canvas>
                </div>
                <div class="pay-qrcode-label">
                    <span>请使用<span class="channel-text">支付宝支付</span>：</span>
                    <span>
                    <span class="price-container">
                        <span class="pay-qrcode-label-money">100元</span>
                        <span class="real-price">100元</span>
                        <div class="coupon-info">
                            首单立减20
                        </div>
                    </span>
                    <span class="original-price">1000</span>
                   
                    </span>
                  
                </div>
                <div class="pay-qrcode-status">
                    <span>
                        <span class="left-text">未支付成功，请重新扫码支付</span>
                        <a class="link" one-link-mark="yes">我已完成支付</a>
                    </span>
                </div>
                <div class="pay-notes">
                    <span>付费即表示同意<a href="https://activity.lagou.com/app/business/service-agreement.html" }="" target="_blank" one-link-mark="yes">《拉勾网在线增值服务协议》</a></span>
                </div>
    </div>
</div><div class="lg-pay-recharge" style="display: none;">
    <div class="lg-pay-container lg-pay-recharge-confirm">
        <div class="lg-pay-close"></div>
        <div class="recharge-title">勾豆充值</div>
        <div>
            <div class="recharge-label">填写充值勾豆数量</div>
            <div class="recharge-amount">
                <input type="text" class="amount input" min="0" max="9999" value="100">
            </div>
        </div>
        <div class="recharge-tips">
            需支付：<span class="count-show">100元</span><span class="recharge-description">（1元=1勾豆）</span>
        </div>
        <div class="recharge-btn">立即充值</div>
    </div>
</div><script type="text/javascript" crossorigin="anonymous" src="./Dubbo源码解读与实战 - 资深技术专家 - 拉勾教育_files/oss.js"></script>

<div id="cboxOverlay" style="display: none;"></div><div id="colorbox" class="" role="dialog" tabindex="-1" style="display: none;"><div id="cboxWrapper"><div><div id="cboxTopLeft" style="float: left;"></div><div id="cboxTopCenter" style="float: left;"></div><div id="cboxTopRight" style="float: left;"></div></div><div style="clear: left;"><div id="cboxMiddleLeft" style="float: left;"></div><div id="cboxContent" style="float: left;"><div id="cboxTitle" style="float: left;"></div><div id="cboxCurrent" style="float: left;"></div><button type="button" id="cboxPrevious"></button><button type="button" id="cboxNext"></button><button id="cboxSlideshow"></button><div id="cboxLoadingOverlay" style="float: left;"></div><div id="cboxLoadingGraphic" style="float: left;"></div></div><div id="cboxMiddleRight" style="float: left;"></div></div><div style="clear: left;"><div id="cboxBottomLeft" style="float: left;"></div><div id="cboxBottomCenter" style="float: left;"></div><div id="cboxBottomRight" style="float: left;"></div></div></div><div style="position: absolute; width: 9999px; visibility: hidden; display: none;"></div></div></body></html>